Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


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();
	}

 

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

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 смущает, я не нашел описания икой функции.

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


Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
 Погделиться

×
×
  • Создать...

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

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