Zend_Session/Zend_Auth随机抛出错误消息ps_files_cleanup_dir:opendir(/ var/lib/php5)失败:权限被拒绝(13)

Han*_*nes 26 php zend-framework zend-auth zend-session

我正在使用Zend_Auth(除其他外)使用Zend_Auth进行新的应用程序,但无论出于何种原因,此错误消息在任何位置完全随机出现(或者它接缝)

Zend_Session::start()- /home/hannes/workspace/develop/library/Zend/Session.php(Line:480):错误#8 session_start()[function.session-start]:ps_files_cleanup_dir:opendir(/ var/lib/php5)失败:权限被拒绝( 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}

小智 16

显然这个问题主要影响(仅限?)基于debian/ubuntu的系统,并且与自动会话垃圾收集有关.

变量session.gc_probability在php.ini中设置为1,这意味着垃圾收集器运行和清理存储php会话的目录/ var/lib/php5的概率为1%.

显然这个文件夹不能被www-data写入,导致上述错误并抛出Zend异常.将session.gc_probability设置为0解决了问题.无论如何,会话文件夹由cron作业清理,因此不需要php垃圾收集器甚至运行.

来自http://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-session-phpini-garbage

  • +1:很棒的答案!如果链接将来不起作用,这里是解决方案:变量`session.gc_probability`在`php.ini`中设置为`1`,这意味着垃圾收集器运行的概率为1%并清理存储php会话的目录`/ var/lib/php5`.显然这个文件夹不能被`www-data`写入,导致上述错误并抛出Zend异常.将`session.gc_probability`设置为'0`解决了这个问题.无论如何,会话文件夹由cron作业清理,因此不需要php垃圾收集器甚至运行. (3认同)

小智 12

解决方案是将php.ini文件中的session.save_path设置为可写目录.例如:session.save_path ="/ tmp".在第一个示例中关闭会话垃圾回收不是一个好主意.第二个例子不适用于Ubuntu 10.04

  • 对不起,刚刚来到这里.这是一个糟糕的解决方案.为什么?因为除了root之外的任何人都可以进入此目录.我认为在运行php的网络服务器上,会话目录是最脆弱的目录之一.假设您有一个可利用的Web应用程序,它为您提供对/ tmp的读取权限,攻击者只能通过获取文件名来劫持当前处于活动状态的任何会话.上帝知道会话本身中哪些易受攻击的数据.总而言之,在TMP下提供会议是一个非常糟糕的想法.故事结局!:) (10认同)

小智 11

实际上,更改session.save_path的目录会关闭垃圾回收.这就是它现在适合你的原因.如果你想要垃圾收集你可以将原始目录所有者更改为php用户"www-data"

chown www-data/var/lib/php5

在替代方案中,您可以为新目录编写垃圾收集脚本.


小智 5

我也遇到了Symfony框架的这个问题,问题是php没有会话存储目录的权限.只需将会话保存目录更改为可写的位置即可.在Zend Framework Bootstrap config ini中:

resources.session.save_path = APPLICATION_PATH "/../data/session"
Run Code Online (Sandbox Code Playgroud)