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 相关文章推荐
PHP编程与应用
Oct 09 PHP
php执行sql语句的写法
Mar 10 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
PHP中static关键字以及与self关键字的区别
Jul 01 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
Sep 30 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 PHP
PHP抽象类与接口的区别详解
Mar 21 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
FCKeditor添加自定义按钮
2008/03/27 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
详解PHP数组赋值方法
2015/11/07 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
通过js获取div的background-image属性
2013/10/15 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
js 函数性能比较方法
2020/08/24 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
德国帽子专家:Hutshopping
2019/11/03 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
个人综合鉴定材料
2014/05/23 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL