概率为10%,我在我的项目中遇到了以下问题:
ps_files_cleanup_dir opendir(/var/lib/php5) failed permission denied (13)
根据我的一些R&我明白问题的原因是:
PHP正在尝试删除会话文件 由Debian软件包维护人员在系统上完成的cron-job完成 PHP。 Ubuntu的软件包维护者相信解决方案 在PHP中清理会话数据是不安全的。
所以,我搜索互联网来解决这个问题并找到了两个解决方案:
php.ini
将session.gc_probability
设置为0
。- 在
中写下自定义路径 醇>session.save_path
。解决方案1的问题是我允许PHP管理 垃圾收集流程并让所有身份验证到操作系统(Ubuntu 12.04)维护者来处理这个和这个 可能会导致PHP不安全。所以,我不会这样做 溶液
对于第二个,我必须更改会话默认路径 将使用php和默认路径(可能是tmp路径)处理 Ubntu维护者。
那么,在上述两种解决方案中,哪种方案最好又安全?或者Ubuntu Os的会话权限问题是否还有其他解决方案?
感谢。
答案 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');