Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


 Share

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 comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites


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

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

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

Link to comment
Share on other sites

Just now, chukcha said:

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

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

Link to comment
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
 Share

×
×
  • 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.