文档章节

PHP Notice: session_start(): ps_files_cleanup_dir

雪之丞
 雪之丞
发布于 2015/03/02 17:22
字数 576
阅读 13
收藏 0
点赞 0
评论 0
如果在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 roo

而一般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 r

另外, 可以看到, 在判别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_diviso

也就是说, 默认情况下, 差不多是100次能调用一次gc过程. 所以也就是小概率的可以看到这个Notice.
要关闭这个Notice, 只需要设置:
session.gc_probability = 0, 让s_gc完全没有运行的可能即可.
当然, 你也可以改变这个文件夹的权限…
最后, 感谢CFC4N提供这个问题.
作者: Laruence( )

© 著作权归作者所有

共有 人打赏支持
雪之丞
粉丝 12
博文 209
码字总数 51065
作品 0
浦东
程序员
PHP 7.0.9 正式发布

PHP 7.0.9 正式发布了。 下载地址:http://php.net/distributions/php-7.0.9.tar.gz 改进日志如下: - Core: . Fixed bug #72508 (strange references after recursive function call and "......

mia0x75 ⋅ 2016/07/20 ⋅ 45

php session 模块的源代码解析

首先是扩展中的目录结构 首先来看几个重要的数据结构,第一个psmodulestruct代表着PHP中session中要实现的几个处理session的函数指针,分别的作用是open、close、read、write、destory等功能...

yusaint ⋅ 2013/07/02 ⋅ 0

php.ini xdebug配置

[PHP] ;;;;;;;;;;;;;;;;;;; ; About php.ini ; ;;;;;;;;;;;;;;;;;;; ; PHP's initialization file, generally called php.ini, is responsible for ; configuring many of the aspects of PH......

T_star ⋅ 2014/12/16 ⋅ 0

LNMP架构介绍,MySQL、PHP安装,Nginx介绍

LNMP 架构介绍 > LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。Nginx中的PHP是以fastcgi的方式结合Nginx的,可以理解为Nginx代理了PHP的fastcgi。 LNMP 工作模式 和LAMP不...

豆渣锅 ⋅ 01/02 ⋅ 0

Windows下apache php wordpress配置

2. Use notepad to open httpd.conf config file. Make use the line "" is un-commented. 3. Under "" section, change the line "" to "". 4. Change the line "" to "". This is because ......

mikelij ⋅ 2013/06/22 ⋅ 0

PHP入门常见问题

php环境: Debian 7.8 + Apache 2.2.22 + Mysql 5.5.44 + PHP 5.4.44 1、php文件语法检查 浏览器输入: http://localhost/parse-error.php ,显示空白网页。 2、moveuploadedfile移动文件未生...

超爱fitnesse ⋅ 2015/09/01 ⋅ 0

php session memcache tomcat

php session memcache tomcat 1,php编译安装 yum -y install libcurl-devel bzip2-devel libxml2-devel mhash-devel libmcrypt-devel gcc ./configure --prefix=/usr/local/php --enable-mb......

小雨yyy ⋅ 2014/06/09 ⋅ 0

使得CI在NetBeans 8.0中自动提示CI相关类和方法

把这两个文件放到项目文件根目录的nbproject文件夹下面,运行index.php如:http://localhost/你的CI目录/nbproject/index.php,之后重启netbeans。试试写$this->看后面出现什么!哈哈哈 inde...

康师傅 ⋅ 2014/08/12 ⋅ 4

Centos6和Centos7上安装LAMP(PHP-FPM模式、编译安装)

-------------------------实验:CentOS 7安装LAMP(PHP-FPM模式)--------------------- 1、安装PHP-FPM 首先要卸载PHP: yum remove php yum install php-fpm 2、 查看php-fpm所对应的配置文......

Lightmisa ⋅ 2017/10/29 ⋅ 0

php SWFUpload 怎么创建缩略图并且保存到指定文件夹里面

upload.php <?php /* * swfupload图片上传 */ if (isset($_POST["PHPSESSID"])) { sessionid($POST["PHPSESSID"]); } session_start(); iniset("htmlerrors", "0"); if (!isset($FILES["Fil......

李世晨 ⋅ 2012/11/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Boost库编译应用

版本:Boost 1.66.0 Windows库编译 官网指南:直接执行bootstrap.bat处理文件即可,可以我却遇到一堆的问题。 环境:Windows 10 + Visual Studio 2017 Boost编译出来库命名 boost库生成文件命...

水海云 ⋅ 12分钟前 ⋅ 0

解决Eclipse发布到Tomcat丢失依赖jar包的问题

如果jar文件是以外部依赖的形式导入的。Eclipse将web项目发布到Tomcat时,是不会自动发布这些依赖的。 可以通过Eclipse在项目上右击 - Propertics - Deployment Assembly,添加“Java Build ...

ArlenXu ⋅ 12分钟前 ⋅ 0

iview tree组件层级过多时可左右滚动

使用vue+iview的tree组件,iview官网iview的tree树形控件 问题描述:tree层级过多时左右不可滚动 问题解决:修改overflow属性值 .el-tree-node>.el-tree-node_children { overflow: vi...

YXMBetter ⋅ 14分钟前 ⋅ 0

分布式锁

1.通过数据库实现 http://www.weizijun.cn/2016/03/17/%E8%81%8A%E4%B8%80%E8%81%8A%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E7%9A%84%E8%AE%BE%E8%AE%A1/ 2.ZK实现:curator-recipes分布式锁的......

素雷 ⋅ 22分钟前 ⋅ 0

Sublime Text3 快捷键

选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。 Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名...

AndyZhouX ⋅ 29分钟前 ⋅ 0

XamarinAndroid组件教程RecylerView自定义适配器动画

XamarinAndroid组件教程RecylerView自定义适配器动画 如果RecyclerViewAnimators.Adapters命名空间中没有所需要的适配器动画,开发者可以自定义动画。此时,需要让自定义的动画继承Animation...

大学霸 ⋅ 29分钟前 ⋅ 0

eureka 基础(二)

使用Eureka服务器进行身份验证 如果其中一个eureka.client.serviceUrl.defaultZone网址中包含一个凭据(如http://user:password@localhost:8761/eureka)),HTTP基本身份验证将自动添加到您...

明理萝 ⋅ 32分钟前 ⋅ 1

Kubernetes(五) - Service

Kubernetes解决的另外一个痛点就是服务发现,服务发现机制和容器开放访问都是通过Service来实现的,把Deployment和Service关联起来只需要Label标签相同就可以关联起来形成负载均衡,基于kuberne...

喵了_个咪 ⋅ 33分钟前 ⋅ 0

更新队友POM文件后报错

打开报错的地方的pom及其引用方法所在文件的pom,观察其版本号是否一致,不一致进行更改

森火 ⋅ 46分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 51分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部