Ubuntu/Debian下apt安装PHP使用Session小概率遇提示及原因
在 ubuntu 或 Debian 系统下,如果是通过 apt 安装的 PHP,那么在使用 Session 时,有可能会以较小的概率遇到这个提示。

PHP 发出通知:session_start()函数中,出现了 ps_files_cleanup_dir 的相关情况。 打开 /var/lib/php5 失败了,原因是权限被拒绝(13)。 在 /home/laruence/www/htdocs/index.php 中处于在线状态 22 。
这是因为在 PHP 里,若将 file_handler 用作 Session 的 savehandler ,那么就有可能在每次调用 session_start 时运行 Session 的 Gc 过程。
//有省略
intnrdels=-1;
nrand 等于 (int)类型的 ((float)PS(gc_divisor)乘以 php_combined_lcg(TSRMLS_C));
if(nrand调用 s_gc 函数,传入 PS(mod_data)、PS(gc_maxlifetime) 作为参数,同时传入 &nrdelsTSRMLS_CC 作为另一个参数。
}
//有省略
这个警告的原因是,在 apt 的 PHP 中,session 的默认目录是/var/lib/php5,其权限是 733 且带有 sticky bit 。
drwx-wx-wt root root
一般 PHP 的 worker 通常运行在非 root 身份下,因此它没有权限打开这个文件夹。不过由于可以进行写入操作,所以不会影响正常的 Session 文件读取。于是在 s_gc 中的如下代码,就会引发开头所提到的 Notice。
对于 filehandler 而言,s_gc 会以间接的方式调用 ps_files_cleanup_dir 。
dir=opendir(dirname);
if(!dir){
php_error_docref 函数,参数为 NULLTSRMLS_CC,错误级别为 E_NOTICE
ps_files_cleanup_dir 打开目录(%s)失败,原因是:%s(%d)
获取目录名、错误字符串(通过错误号获取)以及错误号本身。
return(0);
}
在 ubuntu 系统和 Debian 系统下,是存在 gc 回收的。这种回收工作是由外部的 cron 进程来完成的。其默认的设置位置在 /etc/cron.d/php5 。
root 位于 -x/usr/lib/php5/maxlifetime 处,其编号为 09,39* 且带有三个星号。 在 /var/lib/php5 目录下进行查找操作,即查找 /var/lib/php5 这个路径。 使用 /usr/lib/php5/maxlifetime 与 -typef-cmin 进行加法运算,然后输出结果为 0 |xargs-n200-r-0rm
另外,可以看出,在对 s_gc 是否运行进行判别时,存在两个关键变量:PS(gc_divisor)和 PS(gc_probability)。这两个变量分别与 session 的运行时配置项中的两个同名配置项相对应。
session.gc_divisor 默认值为 100 。
php_combined_lcg 是一个能够生成随机数的发生器,它生成的随机数在 0 到 1 的范围之间。因此,上面的判别就相当于:
rand默认情况下,大概 100 次能调用一次 gc 过程。所以看到这个 Notice 的概率较小。
要关闭这个Notice,只需要设置:
session 的 gc_probability 为 0,这样就能确保 s_gc 完全没有运行的可能性。
当然,你也可以改变这个文件夹的权限…