2015-03-20 2 views
1

С вероятностью 10%, я получаю ниже вопрос в моем проекте:Выпуск ps_files_cleanup_dir: Разрешение отказано

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

По моему какой-то R & D я понимаю, что вопрос вызывает это:

PHP пытается удалить файлы сеанса, в то время как это также , выполненное cron-заданием, установленным в системе сторонними разработчиками пакета Debian PHP. Сторонники пакета Ubuntu полагали, что решение для очистки данных сеанса в PHP небезопасно.

Итак, у меня есть поиск Интернет вокруг, чтобы решить эту проблему и нашел 2 решения:

  1. php.ini набор session.gc_probability к 0.
  2. Напишите пользовательский путь в session.save_path.

Проблема Решение 1 является Я Dis-разрешительная PHP для управления процессом сбора мусора и пусть Отдать все проверку подлинности операционной системы (Ubuntu 12.04) Maintainers, чтобы справиться с этим, и это может быть вызванный неуверенностью в PHP. Итак, я не собираюсь с этим решением .

И для второго я должен изменить путь по умолчанию для сеанса, который будет использовать php и путь по умолчанию (может быть путь tmp) обработан Ubntu Maintainers.

Итак, в обоих этих двух решениях, которые могут быть лучшими и безопасными? Или есть ли какое-либо другое решение для такого разрешения для сеанса для Ubuntu Os?

Спасибо.

ответ

0

Вы можете (и, возможно, должны) использовать свой собственный обработчик сеанса; например, базы данных. Затем вы можете масштабировать сеансы за пределами одного экземпляра и одновременно решать свою проблему.

Редактировать: вы можете использовать этот старый код, который может потребоваться для DBAL.

<?php 
 

 
    require_once('lib/Mapper.php'); 
 

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

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

+0

'Own Session Handler' означает, что вы хотите, чтобы я использовать путь пользовательского сеанса? –

+0

См. Мой обновленный комментарий и, по сути, да (но без необходимости изменять php.ini) – Spechal

+0

Хорошо, это может быть 3-е решение, но мне нужно убедиться, что код будет отлично работать для моих обработчиков сеансов. Как только только для вероятности 10% предупреждения, я не могу использовать «собственный или настраиваемый сеанс» –

Смежные вопросы