|
2#
楼主 |
发表于 2018-3-5 09:57:36
|
只看该作者
cookie的名字PHPSESSID是可以改的,在php.ini中 session.name = PHPSESSID就是设置该cookie的名字。
结合自己实际开发中遇到的问题,总结一下:要说session跟cookie有关联的地方,就是跟PHPSE
SSID这个cookie有绑定关系。其他,不管你设置什么cookie,使用session的时候是不会用到这些
值的。也无法获取到。比如同步登陆,设置即使设置了cookie,而你的应用是依据session判断是
否为登陆状态的(事实上也必须如此,因为session保存在服务器端,安全性更高,哪个依据cook
ie认为你已经登陆,那么很惨)。
所以,这样的情况就会出现,即使成功设置了cookie。也还是不能同步登陆。
三、经常遇到的现象:为什么删除一个session文件,之后生成一个session文件,新的文件名字
还是与原来一样?
理解到session文件的命名规则是:“sess_PHPSESSID值“。那么,就很容易明白了。因为,客户端存
在cookie:PHPSESSID。客户端发送请求后,会将该cookie发送给服务器(php可以使用$_COOKIE['P
HPSESSID']看到其内容),这样的话,还是会根据PHPSESSID生成一个session文件的。
四、如何查看session文件中的session值?
我在开发中发现,如果仅仅依靠session_start()和$_SESSION['user_id']这样的代码,去调试,还不
够全面的了解问题所在。
比如,我想知道,session_start()到底在完成哪些操作?如果,想动态,实时知道session的值是如
何被改写的,打开一个session文件,查看是很了然的。
原来,里面就是保存的是一些被序列化后的值。也明白一个知识点,"php圣经"中讲解session的时
候,提到session值做被序列化了。下面看到的session内容就是被序列化了。
打开一个session文件,内容如下:
cityID|i:0;cityName|s:3:"all";fanwe_lang|s:5:"zh-cn";fanwe_currency|a:4:{s:2:"id";s:1:"1";s:6:"
name_1";s:9:"人民币";s:4:"unit";s:3:"¥";s:5:"radio";s:6:"1.0000";}_fanwe_hash__|s:32:"77c
18770c6cb5d89444c407aaa3e8477";
总结出读取规则:
1、每一个session的值是以分号";"分开的。比如“cityID|i:0;cityName|s:3:"all";”就是一个完整的session值结束
2、里面的读取规则:符号“|”前面表示session名称。符号后面是该session的具体信息。包括:数
据类型,字符长度,内容。上面第一个就相当于使用如下php代码访问_SESSION['cityID']
后面的s表示数据值的长度,3表示字符长度。比如这一段:fanwe_lang|s:5:"zh-cn"; fanwe_lan
g是变量的名称,变量值是"zh-cn",长度刚好是5,就是”s:5“标明的。
最后"all"就表示session的具体值了。就是使用代码$_SESSION['cityID']后会得到的结果。
3.一个session可以保存一个数组。符号{}表示数组的内容。上面的花括号{}是$_SESSION['fanw
e_currency']所保存的内容。要想查看id的值,就使用代码:$_SESSION['fanwe_currency']['id']
五、怎么样理解session_start等函数所做的实际操作是什么?
我是这样理解的:session_start,可以看成是创建一个session文件。假如有原来的session文件,
或许没有创建。引入一个。往session文件中写值,那是代码“$_SESSION['']=" "; 赋值所完成的
操作。
session_start()生成一个新的session文件名时。会判断是否存在cookie名为PHPSESSID的值。如果
存在,那么就会按照它的值,组合成一个文件名"sess_[phpcookie值]"。所以,在目录下,老是能
够看到之前删除过的session文件名。如果将浏览器中对应的cookie(PHPSESSID)删掉。那么就不会
生成同样的名字了。如果不存在名为PHPSESSID的cookie。php所做的估计为:先发送一个cookie
,然后按照cookie的值生成一个(我可以在浏览器中马上看到一个名为PHPSESSID的cookie)
其实,现在也更加深刻地理解了一个知识:在调用session_start()之前不能有任何输出。有输出
就会报错。
session_start()已经封装了发送cookie的操作(发送一个名称为PHPSESSID的cookie到浏览器)。涉及
到http的一个原理:头部信息必须在内容之前发送才行。所以,使用echo '内容';
header('Content-type: text/xml; charset=gb2312');//头部信息,不算内容
可以这样认为:session_start()内部已经进行了一次发送头部动作。所以之前不能有任何输出内容。
手册中的英文大致是这样说的:创建一个session,或者恢复当前一个session(基于request请求传
递的session id,这里应该值的就是http请求时传递的名为PHPSESSID的cookie)
实际开发应用总结:
只要是同一个用户的操作。导航程序访问记录和团购程序访问的记录都是保存在同一个sessio
n文件中
如果是不同的域呢?假如用户访问cs.test.com和daohang.test.com,两方程序都设置了session
。那么session的结果保存在同一个session文件中吗?
因为:服务器是统一管理session文件的存放的。而php引擎是根据phpsessionid的值确定要操作
哪个session文件。session
文件名的格式是:"sess_[phpcookie值]"。依次寻找对应的session文件(于是在浏览器查看名为P
HPSESSIONID的cookie,过期时间是在会话结束后)
所以,只要cs.test.com和daohang.test.com使用的是同一台服务器。
这样的话,假如是多台服务器的情况。那么就不得不将session保存在数据库中去。这样实现s
ession共享。跟具体的服务器是无关的。
|
|