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 相关文章推荐
967 个函式
Oct 09 PHP
php4的session功能评述(二)
Oct 09 PHP
解决phpmyadmin 乱码,支持gb2312和utf-8
Nov 20 PHP
PHP伪造referer实例代码
Sep 20 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
PHP教程 基本语法
Oct 23 PHP
php数组中删除元素之重新索引的方法
Sep 16 PHP
php的ddos攻击解决方法
Jan 08 PHP
php实现文件上传及头像预览功能
Jan 15 PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 PHP
PHP判断函数是否被定义的方法
Jun 21 PHP
详解Laravel框架的依赖注入功能
May 27 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&amp;java(三)
2006/10/09 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
Python实现在线音乐播放器
2017/03/03 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
海南地接欢迎词
2014/01/14 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
竞聘书模板
2014/03/31 职场文书
赔偿协议书范本
2014/09/12 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
英文慰问信
2015/02/14 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
学校少先队工作总结
2015/08/12 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python