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 相关文章推荐
对盗链说再见...
Oct 09 PHP
解决PHP超大文件下载,断点续传下载的方法详解
Jun 06 PHP
浅谈PHP强制类型转换,慎用!
Jun 06 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
php一些错误处理的方法与技巧总结
Aug 10 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
PHP多态代码实例
Jun 26 PHP
详解php的socket通信
Aug 11 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 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 字符串函数收集
2010/03/29 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
简单的Python抓taobao图片爬虫
2014/10/26 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
详解Python验证码识别
2016/01/25 Python
用python制作游戏外挂
2018/01/04 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
2014年党务公开实施方案
2014/02/27 职场文书
物业经理自我鉴定
2014/03/03 职场文书
驾驶员安全责任书
2014/07/22 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
运动会通讯稿100字
2015/07/20 职场文书
老人院义工活动感想
2015/08/07 职场文书