Перейти к содержанию
Xelen

Автоочистка устаревших сессий в БД

Рекомендуемые сообщения

Не могу разобраться с вопросом.

Заметила, что в таблице сессий в БД, истекшие сессии не очищаются, а накапливаются месяцами.

в файле /system/library/session/db.php

есть функция

public function gc($expire) {
	$this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE expire < " . ((int)time() + $expire));
		
	return true;
}

как я поняла, она должна очищать истекшие сессии, беря значение времени жизни сессии из кода, что ниже

$this->expire = ini_get('session.gc_maxlifetime');

в php.ini указано session.gc_maxlifetime = 3600;

 

Но ничего не чистится.

Я заглянула в таблицу создаваемых сессий, и заметила, что время жизни сессии прибавляется к времени начала сессии совсем не 3600, а из настроек php у сервера 1440

То есть этот код не берет данные из php.ini

заменила на

$this->expire = 3600;

после этого стало прибавлять ровно час.

но function gc($expire), которая тут самая первая в посте,  видимо так и не срабатывает- устаревшие сессии так и лежат в бд

Вопрос собственно в чем. Почему этот код не подцепляет запись из php.ini

$this->expire = ini_get('session.gc_maxlifetime');

и почему так и не удаляются устаревшие сессии?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

потому что php ничего не знает о вашей базе

т.е. session.save_handler никак не определяется

Поєтому -  в крон - написать обработчик, и... вызывать (хм, а что вызывать?) если метод есть только в адаптере
Проще свой обработчик вызвать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, chukcha сказал:

потому что php ничего не знает о вашей базе
 

 

а почему тогда из этого же файла без крона срабатывает функция перезаписи сессии в БД?

	public function write($session_id, $data) {
		if ($session_id) {
			$this->db->query("REPLACE INTO `" . DB_PREFIX . "session` SET session_id = '" . $this->db->escape($session_id) . "', `data` = '" . $this->db->escape(json_encode($data)) . "', expire = '" . $this->db->escape(date('Y-m-d H:i:s', time() + $this->expire)) . "'");
		}
		
		return true;
	}

все же, думаю, знает)

заменила $this->expire на 300. прибавляет 5 минут. Да и выше я писала, что срабатывает замена кода на число.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хе
откройте sysytem/libfarary/session.php

и

2 .$this->data = $this->adaptor->read($session_id);

 

3 .$this->adaptor->write($this->session_id, $this->data);

 

1 . register_shutdown_function(array($this, 'close'));
 

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 минут назад, chukcha сказал:

хе
откройте sysytem/libfarary/session.php

и

2 .$this->data = $this->adaptor->read($session_id);

 

3 .$this->adaptor->write($this->session_id, $this->data);

 

1 . register_shutdown_function(array($this, 'close'));
 

 

то есть функция gc это непонятно зачем написана?

 

а почему не считывает время жизни сессии из .ini?

 

выходит, код в файле какой-то левый, типа вещь в себе.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не доделано!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можете сами

 

	public function __construct($registry) {
		$this->db = $registry->get('db');
		
		$this->expire = ini_get('session.gc_maxlifetime');
$this->gc();
	}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, chukcha сказал:

не доделано!!!

 

ах, вононочё :-D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, chukcha сказал:

можете сами

 


	public function __construct($registry) {
		$this->db = $registry->get('db');
		
		$this->expire = ini_get('session.gc_maxlifetime');
$this->gc();
	}

 

 

это в  какой файл. Этож конструктор из db.php

там выдает

Warning: Missing argument 1 for Session\DB::gc(), called in

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ито это только если задать числом

$this->expire = 3600;

 

если

$this->expire = ini_get('session.gc_maxlifetime');

 

белая страница. я писала, он не тащит из ini значение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что за функция __destroy() в session.php. Может там должна быть функция __destruct(), т.е. вызов деструктора, тогда и сессии можно будет чистить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, lexxkrt сказал:

что за функция __destroy() в session.php. Может там должна быть функция __destruct(),

Не выдумывайте,
Я показал возможное решение
даже два

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Just now, chukcha said:

Не выдумывайте,
Я показал возможное решение
даже два

Ваше решение понятно, даже наверное правильно удалять старые сессии до использования новых, просто меня магическая функция __destroy смущает, я не нашел описания такой функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наличие __ не делает ее магической

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.