Jump to content
покупайте без комиссии
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


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');

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites
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 минут. Да и выше я писала, что срабатывает замена кода на число.

Link to post
Share on other sites

хе
откройте 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
Link to post
Share on other sites
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?

 

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

 

Link to post
Share on other sites

можете сами

 

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

 

Link to post
Share on other sites
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

 

Link to post
Share on other sites

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

$this->expire = 3600;

 

если

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

 

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites
Just now, chukcha said:

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

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

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.