Ubuntu/Debian下apt安装PHP使用Session小概率遇提示及原因

在 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 完全没有运行的可能性。

当然,你也可以改变这个文件夹的权限…

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

54阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

45阅读

php一句话木马,一句话木马ctf

2026年10月05日

48阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

50阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

48阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

43阅读