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 连接mysql连接被重置的解决方法
Feb 15 PHP
谷歌音乐搜索栏的提示功能php修正代码
May 09 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
php获取指定数量随机字符串的方法
Feb 06 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
Apr 30 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
Oct 10 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 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 移除数组重复元素的一点说明
2008/11/27 PHP
PHP基础知识介绍
2013/09/17 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
JSONP之我见
2015/03/24 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
Ubuntu系统下Angularjs开发环境安装
2016/09/01 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
Python输出各行命令详解
2018/02/01 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
工程总经理工作职责
2013/12/09 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
保护环境演讲稿
2014/05/10 职场文书
校园演讲稿汇总
2014/05/21 职场文书
世界地球日活动总结
2015/02/09 职场文书
护士个人年终总结
2015/02/13 职场文书
岗位职责范本大全
2015/02/26 职场文书
人民的好儿女观后感
2015/06/18 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技
Go并发4种方法简明讲解
2022/04/06 Golang