php Zend_Session / Zend_Auth 随机抛出错误信息 ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 
原文地址: http://stackoverflow.com/questions/2930870/
Warning: these are provided under cc-by-sa 4.0 license.  You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Zend_Session / Zend_Auth randomly throws Error Message ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13)
提问by Hannes
I'm currently working on a new Application using (among other things) Zend_Auth but, for whatever reason, this Error Message is showing up at any location totally randomly (or so it seams)
我目前正在使用(除其他外)Zend_Auth 开发一个新应用程序,但是,无论出于何种原因,此错误消息完全随机地出现在任何位置(或因此接缝)
Zend_Session::start()- /home/hannes/workspace/develop/library/Zend/Session.php(Line:480): Error #8session_start()[function.session-start]: ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13) Array
Zend_Session::start()- /home/hannes/workspace/develop/library/Zend/Session.php(Line:480): Error #8session_start()[function.session-start]: ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied ( 13) 数组
- #0 /home/hannes/workspace/develop/library/Zend/Session/Namespace.php(143): Zend_Session::start(true)
- #1 /home/hannes/workspace/develop/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth')
- #2 /home/hannes/workspace/develop/library/Zend/Auth.php(91): Zend_Auth_Storage_Session->__construct()
- #3 /home/hannes/workspace/develop/library/Zend/Auth.php(141): Zend_Auth->getStorage()
- #4 /home/hannes/workspace/develop/xxxxxxx/application/controllers/AdminController.php(10): Zend_Auth->hasIdentity()
- #5 /home/hannes/workspace/develop/library/Zend/Controller/Action.php(133): AdminController->init()
- #6 /home/hannes/workspace/develop/library/Zend/Controller/Dispatcher/Standard.php(262): Zend_Controller_Action->__construct(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http), Array)
- #7 /home/hannes/workspace/develop/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
- #8 /home/hannes/workspace/develop/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
- #9 /home/hannes/workspace/develop/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
- #10 /home/hannes/workspace/develop/xxxxxxx/public/index.php(26): Zend_Application->run()
- #11 {main}
- #0 /home/hannes/workspace/develop/library/Zend/Session/Namespace.php(143): Zend_Session::start(true)
- #1 /home/hannes/workspace/develop/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth')
- #2 /home/hannes/workspace/develop/library/Zend/Auth.php(91): Zend_Auth_Storage_Session->__construct()
- #3 /home/hannes/workspace/develop/library/Zend/Auth.php(141): Zend_Auth->getStorage()
- #4 /home/hannes/workspace/develop/xxxxxxx/application/controllers/AdminController.php(10): Zend_Auth->hasIdentity()
- #5 /home/hannes/workspace/develop/library/Zend/Controller/Action.php(133): AdminController->init()
- #6 /home/hannes/workspace/develop/library/Zend/Controller/Dispatcher/Standard.php(262): Zend_Controller_Action->__construct(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http), Array)
- #7 /home/hannes/workspace/develop/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
- #8 /home/hannes/workspace/develop/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
- #9 /home/hannes/workspace/develop/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
- #10 /home/hannes/workspace/develop/xxxxxxx/public/index.php(26): Zend_Application->run()
- #11 {主要}
采纳答案by Toz
A solution is to set the session.save_path in the php.ini file to a writable directory. for example: session.save_path = "/tmp". Switching the session garbage collection off in the first example is not a good idea. The second example does not work on Ubuntu 10.04
解决办法是将php.ini文件中的session.save_path设置为可写目录。例如:session.save_path = "/tmp"。在第一个示例中关闭会话垃圾收集不是一个好主意。第二个例子在 Ubuntu 10.04 上不起作用
回答by robertbasic
Apparently this issue is affecting mostly (only?) debian/ubuntu based systems and has to do with automatic session garbage collection.
显然,这个问题主要影响(仅?)基于 debian/ubuntu 的系统,并且与自动会话垃圾收集有关。
The variable session.gc_probability was set to 1 in the php.ini which means there is a 1% probability for the garbage collector to run and clean up the directory /var/lib/php5 where the php sessions are stored.
Apparently this folder is not writable by www-data resulting in the mentioned error and throwing the Zend exception. Setting session.gc_probability to 0 solved the problem. The session folder is cleaned up by a cron job anyway, so no need for the php garbage collector to even run.
变量 session.gc_probability 在 php.ini 中设置为 1,这意味着垃圾收集器有 1% 的可能性运行并清理存储 php 会话的目录 /var/lib/php5。
显然,www-data 无法写入此文件夹,从而导致上述错误并引发 Zend 异常。将 session.gc_probability 设置为 0 解决了这个问题。无论如何,会话文件夹都由 cron 作业清理,因此 php 垃圾收集器甚至不需要运行。
From http://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-session-phpini-garbage
来自http://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-session-phpini-garbage
回答by Rob
Actually changing the directory of the session.save_path turns garbage collection off. That is why it now works for you. If you want garbage collection you can change the original directory owner to the php user "www-data"
实际上更改 session.save_path 的目录会关闭垃圾收集。这就是为什么它现在对你有用。如果您想要垃圾收集,您可以将原始目录所有者更改为 php 用户“www-data”
chown www-data /var/lib/php5
chown www-data /var/lib/php5
In the alternative you can write a garbage collection script for the new directory.
或者,您可以为新目录编写垃圾收集脚本。
回答by Brady Olsen
I had this problem with the Symfony framework also, the problem is php does not have permission to the session storage directory. Just change the session save directory to somewhere writable. In Zend Framework Bootstrap config ini:
我的 Symfony 框架也有这个问题,问题是 php 没有会话存储目录的权限。只需将会话保存目录更改为可写的位置。在 Zend Framework Bootstrap 配置文件中:
resources.session.save_path = APPLICATION_PATH "/../data/session"
回答by BadHorsie
If you are using PHP 7.0
如果您使用的是 PHP 7.0
sudo chown www-data:www-data /var/lib/php/sessions
回答by Artem Gordinsky
I've had this issue on OS X 10.8.4 with MAMP, using the first Zend Framework. The directory set for session.save_pathin php.iniby default is /Applications/MAMP/tmp/php. I was able to solve it only by deleting everything in that directory.
我在 OS X 10.8.4 和 MAMP 上遇到过这个问题,使用第一个 Zend 框架。默认情况下为session.save_pathin设置的目录php.ini是/Applications/MAMP/tmp/php. 我只能通过删除该目录中的所有内容来解决它。

