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 采集获取指定网址的内容
Jan 05 PHP
php获取当前网址url并替换参数或网址的方法
Jun 06 PHP
php 文件缓存函数
Oct 08 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
thinkphp jquery实现图片上传和预览效果
Jul 22 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
php出租房数据管理及搜索页面
May 23 PHP
PHP面向对象之事务脚本模式(详解)
Jun 07 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
Mar 09 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
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
python 实现IP子网计算
2021/02/18 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
汽车检测与维修个人求职信
2013/09/24 职场文书
人力资源主管岗位职责
2014/01/29 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
人口与计划生育责任书
2015/05/09 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python