Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Xelen

Recommended Posts

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

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

в файле /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();
	}

 

Надіслати
Поділитися на інших сайтах

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 значение

Надіслати
Поділитися на інших сайтах

4 минуты назад, lexxkrt сказал:

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

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

Надіслати
Поділитися на інших сайтах

Just now, chukcha said:

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

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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.