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 开源AJAX框架14种
Aug 24 PHP
php下封装较好的数字分页方法
Nov 23 PHP
PHP变量内存分配问题记录整理
Nov 27 PHP
将php数组输出html表格的方法
Feb 24 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
非常实用的php验证码类
May 15 PHP
Laravel 5.3 学习笔记之 配置
Aug 28 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
PHP全功能无变形图片裁剪操作类与用法示例
Jan 10 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 PHP
php自动加载代码实例详解
Feb 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
python爬取指定微信公众号文章
2018/12/20 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
详解Python 循环嵌套
2020/07/09 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
2015元旦主持词开场白和结束语
2014/12/14 职场文书
加入学生会自荐书
2015/03/05 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
药店收银员岗位职责
2015/04/07 职场文书
催款律师函范文
2015/05/27 职场文书
人代会简报
2015/07/21 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书