对于两次http请求,如果第一次http请求的重要数据要被第二次请求获取,办法是将第一次http请求数据保存下来,保存的办法很多,大体上有使用数据库,缓存,文件等等,那么php中的session实现实际上就是用文件保存http请求的重要数据,我们这里先看看php的session的实现

1、我们先看一下浏览是否有我们测试服务器的cookie信息,如果有,先移除掉。

2、我们开始一个非常简单的php脚本,从浏览器发起请求。

<?php
session_start();if(isset($_SESSION["name"])) {echo $_SESSION["name"];
}
else {echo "name set";$_SESSION["name"] = "Tom";
}

3、我们在服务器端抓包看一下浏览器发送给web服务器的数据包,可以看到在删除我们测试服务器的cookie信息后,发送过去的http头不再带有cookie信息。

4、web服务器在处理后,会将请求信息转给php处理,php处理后会在response 头上增加 Set-Cookie:PHPSESSID=xxxxxxxx ,而后web服务器会把请求头转给浏览器,浏览器在收到Set-cookie要求后,会在客户端增加cookie信息,也就是我们第一步中删除的cookie信息
5、而后,只要cookie信息存在,从浏览器发出的请求都会把cookie信息作为参数发送给web服务器,而后到php,我们再请求一次,可以抓包看到。
6、前面第四步,我们看到php在response头上要求浏览器Set-Cookie,那么PHP在服务端做了什么,我们可以看看php调用了哪些系统函数,至于详细的实现过程,可以参考php的源码。我们看看下图,php打开一个文件/tmp/sess_84uv4bfgrngrgr1285s8a9d8a6文件,实际上这里分成两步,第一步,就是php在服务端,先生成一个唯一的id也就是sess_84uv4bfgrngrgr1285s8a9d8a6,以这个id为文件名,在/tmp/目录下生成一个文件;第二步,将id作为浏览器和服务端通信的一个标识,保存在浏览器的cookie信息里面。
open("/tmp/sess_84uv4bfgrngrgr1285s8a9d8a6", O_RDWR|O_CREAT, 0600) = 5
flock(5, LOCK_EX)                       = 0
fcntl64(5, F_SETFD, FD_CLOEXEC)         = 0
fstat64(5, {st_mode=S_IFREG|0600, st_size=15, ...}) = 0
lseek(5, 0, SEEK_SET)                   = 0
read(5, "name|s:3:\"Tom\";", 15)        = 15
chdir("/usr/local/sina_mobile/php/sbin") = 0
clock_gettime(CLOCK_MONOTONIC, {870988, 244632423}) = 0
times({tms_utime=0, tms_stime=1, tms_cutime=0, tms_cstime=0}) = 516512946
brk(0xa174000)                          = 0xa174000
brk(0xa1b4000)                          = 0xa1b4000
brk(0xa134000)                          = 0xa134000
lseek(5, 0, SEEK_SET)                   = 0
write(5, "name|s:3:\"Tom\";", 15)       = 15
close(5)                                = 0

这里面还看见了tmp文件下session内容的存储格式,我们设置的name值为Tom,存储在文件下,是 name|s:3:"Tom";

6、session使用文件的形式存储是存在缺陷的,我们知道在处理并发比较大的请求的时候,一般有多台前端机,使用文件形式将不能实现session共享,一般情况下会使用memcache缓存来实现session共享。下面是网上摘录的实现session共享的memcache配置方式;

     方法I: 在 php.ini 中全局设置
         session.save_handler = memcache
       session.save_path = "tcp://127.0.0.1:11211"
     
方法II: 某个目录下的 .htaccess :
      php_value session.save_handler "memcache"
      php_value session.save_path  "tcp://127.0.0.1:11211"
    
方法III: 再或者在某个一个应用中:
      ini_set("session.save_handler", "memcache");
      ini_set("session.save_path", "tcp://127.0.0.1:11211");  使 用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。
如果安装的PECL是memcached(使用libmemcache库的那个),则配置应为
ini_set("session.save_handler", "memcached"); // 是memcached不是memcache
ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp:
结论:
  介绍了php对session的大体实现过程,其实里面也可以看出session的问题,session局限于单服务器。 对于一个php应用部署到多台服务器,那么每次访问可能会到不同服务器上,那么就会造成session数据的不一致,目前有些采用memcache来实现session共享,实际上也是对php的session功能的否定。

转载于:https://www.cnblogs.com/yimuren/p/4596038.html

php的session实现相关推荐

  1. 2022面试200题目和答案分布式+微服务+MYSQL+Redis+JVM+Spring

    200题目和答案分布式+微服务+MYSQL+Redis+JVM+Spring等等 带图MD在资源https://download.csdn.net/download/m0_47987937/86509 ...

  2. Struts2 Cannot create a session after the response has been committed 一个不起眼的错误

    严重: Servlet.service() for servlet default threw exception java.lang.IllegalStateException:  Cannot c ...

  3. 解决nginx负载均衡的session共享问题

    之前有写过ubuntu环境下搭建nginx环境,今天来谈一下nginx session共享问题,查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享服务器有多台,用ngi ...

  4. 你想了解的Cookie和Session就在这~

    目录 1.会话的概念 2.保存会话的两种技术 3.Cookie 4.Session(重点) 1.会话的概念 我们知道session的意思就是会话,Cookie和Session 是两种会话技术,我们首先 ...

  5. Cookie和Session的区别与联系

    Cookie和Session Session 会话的理解 Session的作用 HTTP协议的无状态特点 Session的实现原理(重点) Session常用方法: Cookie 基本介绍 经典案例 ...

  6. php – Laravel 7 Session Lifetime

    根据Laravel config / session.php /* |----------------------------------------------------------------- ...

  7. [JAVA EE]session 和 token 机制

    HTTP 协议是无状态的. 即服务器对于客户端每次发送的请求都认为它是一个新的请求. 本次请求和上次请求无法判断是不是同一个客户端操作的. 随着 Web 应用的发展,如在线购物网站,需要登录的网站等, ...

  8. redis缓存和cookie实现Session共享

    分布式项目中要实现单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.com.c.com)都认 ...

  9. 负载均衡中使用 Redis 实现共享 Session

    最近在研究Web架构方面的知识,包括数据库读写分离,Redis缓存和队列,集群,以及负载均衡(LVS),今天就来先学习下我在负载均衡中遇到的问题,那就是session共享的问题. 一.负载均衡 负载均 ...

  10. session文件无法并发操作

    session_start():打开服务器上的session文件. session_commit():会把$_SESSION数组的内容写入到服务器上的session文件中,但不会清空$_SESSION ...

最新文章

  1. ExcelReport第三篇:扩展元素格式化器
  2. 《敏捷迭代开发:管理者指南》—第2章2.14节推荐读物
  3. python二维数组遍历输出每行最大值_如何在二维数组中找到每行的最大值?
  4. NetBeans IDE 8.0和Java 8的新功能
  5. MYSQL 在当前时间加上或减去一个时间段
  6. Introduction to the 80386
  7. 如何删除MySQL服务
  8. 微信小程序超级占内存_微信小程序彻底拯救16GB手机 小程序与APP占用内存对比...
  9. 关于磁碟机及Javqhc病毒
  10. GOBY--一款攻击面测绘工具的使用
  11. 【转】CC2530/2531/2533对比
  12. 五款优质资源网站 每一个都让你欲罢不能
  13. 线性回归模型(Linear regression model)
  14. Oracle11g下载地址Oracle下载
  15. Egret 2d 实现黑暗下光照效果
  16. Unity中EnableDisableComponent的用法
  17. 施工日志软件哪个好用_哪个单词记忆软件好用?推荐单词突击营软件
  18. PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2、Add-in Card 它们有啥区别?这些概念你搞清楚了吗?
  19. mysql 同步到es_mysql数据实时同步到Elasticsearch
  20. 云服务器怎么安装声音驱动_关于阿里云服务器安装显卡驱动类型的

热门文章

  1. 汽车电池包-云100
  2. C#+Mapxtreme 实现一些GIS系统基本的功能
  3. Ubuntu下查看命令的源码
  4. 【P2766】 最长不下降子序列问题
  5. angular父组件通过@ViewChild 主动获取子组 件的数据和方法
  6. 23 Python常用模块(一)
  7. javascript+dom
  8. 1.4操作系统的变革
  9. oracle中的一些基本概念
  10. 回调函数与Delphi的事件模型