PHP使用Session遇到的一个Permission denied Notice解决办法


Posted in PHP onJuly 30, 2014

如果在ubuntu/Debian下, 采用apt安装的PHP, 那么在使用Session的时候, 就可能会有小概率遇到这个提示.

PHP Notice: session_start(): ps_files_cleanup_dir:

   opendir(/var/lib/php5) failed: Permission denied (13)

   in /home/laruence/www/htdocs/index.php on line 22

这是因为, 在PHP中, 如果使用file_handler作为Session的save handler, 那么就有概率在每次session_start的时候运行Session的Gc过程.

//有省略

        int nrdels = -1;

        nrand = (int) ((float) PS(gc_divisor) * php_combined_lcg(TSRMLS_C));

        if (nrand < PS(gc_probability)) {

            PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels TSRMLS_CC);

        }

//有省略

这个警告的原因是因为在apt的PHP中, session的默认目录/var/lib/php5的权限是733 with sticky bit, 也就是
drwx-wx-wt  root  root

而一般PHP的worker都运行在非root身份下, 所以是没有权限来打开这个文件夹的(但是因为可以write, 所以不影响正常的Session文件读取). 于是在s_gc中的如下代码, 就会触发开头所说的Notice:
//对于file handler来说, s_gc间接调用ps_files_cleanup_dir:

   dir = opendir(dirname);

    if (!dir) {

        php_error_docref(NULL TSRMLS_CC, E_NOTICE,

           "ps_files_cleanup_dir: opendir(%s) failed: %s (%d)",

           dirname, strerror(errno), errno);

        return (0);

    }

当然, 在ubuntu/Debian下, 还是有gc回收的, 只不过是外部的cron进程来完成的, 默认的在/etc/cron.d/php5:,
09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ]

&& [ -d /var/lib/php5 ] && find /var/lib/php5/

 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0

| xargs -n 200 -r -0 rm

另外, 可以看到, 在判别s_gc是否运行的时候, 有俩个关键变量: PS(gc_divisor)和PS(gc_probability), 这俩个变量分别对应着session的运行时配置项的俩个同名配置项:

session.gc_probability和session.gc_divisor, 他们分别默认为1和100.

而php_combined_lcg是一个随机数发生器, 生成0到1范围的随机数, 所以上面的判别相当于:

 rand < probability / gc_divisor

也就是说, 默认情况下, 差不多是100次能调用一次gc过程. 所以也就是小概率的可以看到这个Notice.

要关闭这个Notice, 只需要设置:

session.gc_probability = 0, 让s_gc完全没有运行的可能即可.

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

PHP 相关文章推荐
第八节 访问方式 [8]
Oct 09 PHP
用session做客户验证时的注意事项
Oct 09 PHP
一段防盗连的PHP代码
Dec 06 PHP
php解析url的三个示例
Jan 20 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 PHP
thinkPHP中钩子的两种配置调用方法详解
Nov 11 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
Mar 19 PHP
php对xml文件的增删改查操作实现方法分析
May 19 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 #PHP
PHP return语句的另一个作用
Jul 30 #PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 #PHP
php CI框架插入一条或多条sql记录示例
Jul 29 #PHP
两种设置php载入页面时编码的方法
Jul 29 #PHP
php ci框架中加载css和js文件失败的原因及解决方法
Jul 29 #PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 #PHP
You might like
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
PHP4(windows版本)中的COM函数
2006/10/09 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
js中生成map对象的方法
2014/01/09 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
python使用多线程+socket实现端口扫描
2020/05/28 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
Python实现自动装机功能案例分析
2020/10/22 Python
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
团员个人的自我评价
2013/12/02 职场文书
活动志愿者自荐信
2014/01/27 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
星级党支部申报材料
2014/05/31 职场文书
硕士生找工作求职信
2014/07/05 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
升学宴祝酒词
2015/08/11 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技