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 相关文章推荐
DISCUZ 分页代码
Jan 02 PHP
PHP面向对象概念
Nov 06 PHP
Apache中php.ini的设置方法
Feb 28 PHP
PHP对MongoDB[NoSQL]数据库的操作
Mar 01 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
PHP简单获取视频预览图的方法
Mar 12 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
PHP 二级子目录(后台目录)设置二级域名
Mar 02 PHP
Yii1.1框架实现PHP极光推送消息通知功能
Sep 06 PHP
php7下的filesize函数
Sep 30 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中iconv函数使用方法
2008/05/24 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
javascript基本算法汇总
2016/03/09 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
Windows下安装Scrapy
2018/10/17 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
Python接口测试文件上传实例解析
2020/05/22 Python
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
Nike俄罗斯官方网站:Nike RU
2021/03/05 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
员工工作表扬信范文
2014/01/13 职场文书
生日邀请函范文
2014/01/13 职场文书
学校介绍信范文
2014/01/14 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
员工安全责任书范本
2014/07/24 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
如何在Python中创建二叉树
2021/03/30 Python
mysql如何配置白名单访问
2021/06/30 MySQL
SpringBoot整合Minio文件存储
2022/04/03 Java/Android