导读:昨儿下午和晓亮、力垒探索了下PHP SESSION,虽然知晓了SESSION在单进程SAPI生命周期中的大概步骤,但是,总感觉欠欠的,不踏实。为了验证我们的猜想,是否正确,我看了源码。
一、我们的猜想
1 代码
<?php /** * Under Windows */ // 开启SESSION session_start(); // 获取部分SESSION信息 echo "Session Save Path: ".session_save_path()."\n"; echo "Session Id: ".session_id()."\n"; echo "Session Cookie Params:\n"; var_dump(session_get_cookie_params()); // 种变量 $_SESSION['string'] = 'string'; $_SESSION['int'] = 1; $_SESSION['float'] = 1234567890123; // 查看数组 var_dump( $_SESSION );
输出结果:
f1 CLI 执行了3次
f2 browser (还使用了ff和ie)
我们来看看tmp目录下的文件:
· 基本过程
-- C端发起请求,Apache递交给php-cgi,进入php生命周期阶段,一系列处理(不知为何),生成一个以 sess_*************命名的无类型文件(文件名32位,减去sess_剩余27位),文件内容为key-val对,上例中是 string|s:6:"string";int|i:1;float|d:1234567890123; 。返回给Apache,响应结束时,客户端种下cookie,完成了。如图:
更新:上面提到的文件名位数问题,后经过查看源码,和php.ini中hash_bits_per_character的配置有关:
; Define how many bits are stored in each character when converting ; the binary hash data to something readable. ; Possible values: ; 4 (4 bits: 0-9, a-f) ; 5 (5 bits: 0-9, a-v) ; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") ; Default Value: 4 ; Development Value: 5 ; Production Value: 5 ; http://php.net/session.hash-bits-per-character session.hash_bits_per_character = 5
--CLI下执行是上一个过程的子过程。
1 为什么不同浏览器发起请求和不同次CLI下执行php文件,生成的PHPSESSID不一样呢?
2 这个sess_id是怎么注册的?这个27位数,与什么有关呢?从第一个疑问中可以猜想,和http发起设备或者CLI执行时间抑或这别的?
3 服务端SESSION的存在周期,它是怎么自动回收和主动销毁的呢?
关于第一个问题,有一个猜想,不同浏览器不同,当然不同才行啊,浏览器之间不共享cookie,一样了怎么可以呢。不同CLI下不同,因为每一次都是一个新的进程在处理这一次PHP的声明周期。
其他问题,无法猜想了。和IP有关吗?和设备在PHP内核中的标识符有关吗?和时间有关吗?回收机制和PHP关于内存的回收有没有关呢?
要知道这些问题,只能看源码了。
二、详细的过程
(未完,一直找不到一个比较长的空档,在断断续续看过源码后,SESSID的生成用到了md5——消息摘要算法5和sha1——安全哈希算法。)