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无限分类的类
Jan 02 PHP
php中对2个数组相加的函数
Jun 24 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
php实现贪吃蛇小游戏
Jul 26 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
Dec 29 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP+ajax实现获取新闻数据简单示例
May 08 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
简单的php购物车代码
Jun 05 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
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
js确定对象类型方法
2012/03/30 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
Python中获取网页状态码的两个方法
2014/11/03 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
Python List cmp()知识点总结
2019/02/18 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
python中判断文件结束符的具体方法
2020/08/04 Python
惠普香港官方商店:HP香港
2019/04/30 全球购物
大学生找工作推荐信范文
2013/11/28 职场文书
会计自荐信范文
2014/03/09 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
Python 数据可视化之Bokeh详解
2021/11/02 Python
Python各协议下socket黏包问题原理
2022/04/12 Python