问题ps_files_cleanup_dir:权限被拒绝

时间:2015-03-20 14:36:28

标签: php session garbage-collection ini permission-denied

概率为10%,我在我的项目中遇到了以下问题:

ps_files_cleanup_dir opendir(/var/lib/php5) failed permission denied (13)

根据我的一些R&我明白问题的原因是:

  

PHP正在尝试删除会话文件   由Debian软件包维护人员在系统上完成的cron-job完成   PHP。 Ubuntu的软件包维护者相信解决方案   在PHP中清理会话数据是不安全的。

所以,我搜索互联网来解决这个问题并找到了两个解决方案:

  
      
  1. php.inisession.gc_probability设置为0
  2.   
  3. session.save_path
  4. 中写下自定义路径         

    解决方案1的问题是我允许PHP管理   垃圾收集流程并让所有身份验证到操作系统(Ubuntu 12.04)维护者来处理这个和这个   可能会导致PHP不安全。所以,我不会这样做   溶液

         

    对于第二个,我必须更改会话默认路径   将使用php和默认路径(可能是tmp路径)处理   Ubntu维护者。

那么,在上述两种解决方案中,哪种方案最好又安全?或者Ubuntu Os的会话权限问题是否还有其他解决方案?

感谢。

1 个答案:

答案 0 :(得分:0)

你可以(也许应该)使用你自己的会话处理程序;例如数据库支持的一个。然后,您可以在单个实例之外扩展会话,同时解决您的问题。

编辑:您可以使用我的旧代码,可能需要对DBAL进行一些修改。

<?php

  require_once('lib/Mapper.php');

  class Session extends Mapper {
  	
  	protected $_pKey = 'session_id';
  	protected $_table = 'sessions';
  	protected $_columns = array('session_id', 'session_data', 'expires', 'updated');
  	
  	protected $_session_id = NULL;
  	protected $_lifetime = NULL;
  	
  	protected $_acl = NULL;
  	
  	public function __construct(Database $db, $session_id = NULL){
  		parent::__construct($db);
  		
  		$this->_session_id = $session_id;
  		
  		// Read the maxlifetime setting from PHP
  		$this->_lifetime = ini_get("session.gc_maxlifetime");
  	}
  	
  	public function __destruct(){
  		session_write_close();
  	}
  	
  	public function open($save_path, $session_id){
  		return true;
  	}
  	
  	public function read($session_id){
  		$data = $this->find(array('session_id' => $session_id));
  		if(!empty($data[0]))
  			$session = $data[0]['session_data'];
  		return (!empty($session)) ? $session : '';
  	}
  	
  	public function write($session_id, $data){
  		// where does the session data come from??? set it in the code in the auth and login!!!
  		$bind = array('session_id' => $session_id, 'session_data' => $data, 'expires' => REQUEST_TIME + $this->_lifetime, 'updated' => REQUEST_TIME);
  		if($this->replace($bind)){
  			return true;
  		}
  		return false;
  	}
  	
  	public function close(){
  		return true;
  	}
  	
  	public function destroy($session_id){
  		$this->remove($session_id);
  		return true;
  	}
  	
  	public function gc(){ 
  		$this->_db->query('DELETE FROM '.$this->_table.' WHERE expires < '.(REQUEST_TIME + $this->_lifetime));
  		return true;
  	}
  	
  	public function setId($id){
  		$this->_session_id = $id;
  	}
  	
    public function getId(){
      return $this->_session_id;
    }
  	
    public function find($params = array(), $order = array(), $skip = 0, $limit = NULL){
      return $this->_finder($params, $order, $skip, $limit);
    }
  	
  }

$Session = new Session($_db);
// Register this object as the session handler
session_set_save_handler(
	array( $Session, "open" ),
	array( $Session, "close" ),
	array( $Session, "read" ),
	array( $Session, "write"),
	array( $Session, "destroy"),
	array( $Session, "gc" )
);
session_start();
register_shutdown_function('session_write_close');