现在的位置: 首页 > 综合 > 正文

PHP_ext_session L1 Study Note

2017年12月26日 ⁄ 综合 ⁄ 共 1470字 ⁄ 字号 评论关闭

导读:昨儿下午和晓亮、力垒探索了下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目录下的文件:
se3

· 基本过程

-- 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——安全哈希算法。)

抱歉!评论已关闭.