默认情况下,php的session文件是保存在磁盘文件中。在php.ini配置文件中的配置项如下
session.save_handler = files // 配置项是指定使用files(文件形式)存储session数据。
session.save_path = "N;/path" //。N表示生成多少级目录(不放到一个目录下,分散到多个磁盘目录中去)
session.save_path = "F:/wamp/tmp"。那么就会去这个目录下面看到很多session数据的文件。
当我们使用php的内置函数session_start()的时候,就是去上面指定的磁盘目录把session数据载入,实际上就是拿类似
sess_74dd7807n2mfml49a1i12hkc45的文件。
74dd7807n2mfml49a1i12hkc45就是大家经常说的什么session的id号。
session.name = PHPSESSID
PHPSESSID就是cookie的名称,其实上面一串"74dd7807n2mfml49a1i12hkc45"会保存在一个名为PHPSESSID的cookie中。
根据http的请求机制,当浏览器请求的时候,头部信息会把浏览器中的cookie一起发给服务器。PHPSESSID这个cookie也
是在其中发给了服务器,php引擎通过读取PHPSESSID的值来确定要载入哪个session文件。
比如值为74dd7807n2mfml49a1i12hkc45,载入的就是"sess_74dd7807n2mfml49a1i12hkc45"。
这个可以根据fiddler 抓包 或者 在 代码输出 PHPSESSID日志
问题一,,为什么要用redis 代替session (无聊 ?),,先看看图吧
根据如上原理。session的数据默认是保存在磁盘文件中。
假设这种情况:多台php服务器进行负载均衡的时候
,比如有三台php服务器,为了实现负载均衡,那么三台服务器上面的php代码都是一样(拷贝一份)。
生成session数据文件都是在本地了(a,b,c各自的服务器磁盘上)。
负载均衡的目的本来就是要为了平均分配请求,
所以没有固定第一次访问和第二次访问是同一台服务器,
实际上无法确定的。第一秒访问可能是a服务器,第二秒访问的可能是c服务器
竟然已经知道问题所在,,结合实际 解决办法
目前的 触屏网站 API ios android
在API 的入口加入
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://192.168.2.121:6379?auth=redis@123');
tcp 还有重要参数,,如,根据实际情况而定
//session.save_path = "tcp://192.168.2.121:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2&persistent=1"
实现原理:
当a客户端请求的时候,原来生成在服务器的数据生成到浏览器的cookie中,根据cookie中的数据识别用户。php由原来的”从本地(也就是服务器)磁盘上读取session数据”转变为”浏览器的cookie中读取数据”,
这样子,在多台php服务器负载均衡的情况下,即便第一秒请求是a服务器,第二秒请求是b服务器,都不需要管哪台服务器了。反正都是读取客户端上的cookie数据。
上面的意思就是说 当触屏网站请求API 时,通过curl 协议把 session_id 加载到cookies 实现唯一标识且只有一个sessionid
这个就实现 session 唯一 PHPSESSIONID ,,当然,安卓和ios 也一样!!
sesseion 不是很清楚可以看看这里
php中session的原理,以前做了一下总结,可以参考:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html