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

Сессии и их срок давности в OpenCart 3


 Поделиться

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

Подскажите пожалуйста.

Мне кажется, что механизм сессий в ocStore 3.0.2.0 работает не совсем неправильно.

Во всяком случае у меня.

Если кратко: Данные сессии, связанные с определенным "session_id", восстанавливаются всегда, независимо от срока давности сессии.

При старте сессии, насколько я понял, происходит чтение "session_id" из cookies. (Этот вызов делается в "framework.php".)

Далее, если "session_id" существует (был ранее установлен), то через объект класса "Session" делается запрос к базе данных (если $adaptor = "db") по полученному "session_id",

и из нее извлекается массив переменных, связанных с этой сессией. Но только если сессия не просрочена, иначе возвращается пустой массив.

 

У меня же всегда возвращается заполненный массив, независимо от времени прошедшего с момента сохранения предыдущей сессии, с таким же "session_id".

 

$this->expire = ini_get('session.gc_maxlifetime'); 
Значение у меня равно - 1440 секунд. - Но на изменение значения никакой реакции. Как на хостинге, так и в php.ini

 

Поиск толком выдал вариант который мне не помог..

Как принудить сессии жить указанное в php.ini или на хостинге время?!

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


механизм сессию в том и заключается, что его время жизни временно. хотите долго, то храните пару хэша и айдишника юзера в куках

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

20.07.2022 в 18:25, kJlukOo сказал:

механизм сессию в том и заключается, что его время жизни временно. хотите долго, то храните пару хэша и айдишника юзера в куках

Сейчас сессия живет вечно... А нужно сделать срочно. Сейчас можно зайти в админку, скопировать ссылку и по ней ёрзать в админку без ограничений! А мне нужно что бы у этой ссылки был срок жизни заданный мною в параметре

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


20.07.2022 в 18:27, Kaniel сказал:

Сейчас сессия живет весчно... А нужно сделать срочно

посмотрите в phpinfo(). влияют ли изменения в php.ini на данные выводимые phpinfo. если нет, то значит не тот php.ini

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

20.07.2022 в 18:29, kJlukOo сказал:

посмотрите в phpinfo(). влияют ли изменения в php.ini на данные выводимые phpinfo. если нет, то значит не тот php.ini

Вношу изменения в вайле php.ini в строку session.gc_maxlifetime 3600  
В phpinfo() в строке session.gc_maxlifetime 1440 никак не влияет на него.

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


Нашлось вот такое решение, надеюсь кому то будет это полезным!

В классе «Session\DB», где и происходит формирование запроса, в методе «read» есть следующая запись: system/library/db.php

$query = $this->db->query("SELECT `data` FROM `" . DB_PREFIX . "session` WHERE session_id = '" . $this->db->escape($session_id) . "' AND expire > " . (int)time()); 

 

Здесь есть условие, в котором сравнивается значение поля «expire» с текущим временем.
И если время хранения данных сессии истекло, то есть, если значение «expire» меньше текущего времени, то должен вернуться пустой массив данных.
Но поле «expire» имеет тип datetime, а (int)time() возвращает количество секунд в виде числа.
И похоже, что разные типы сравниваются некорректно, и при таком условии, запись всегда находится и всегда возвращается заполненный массив (конечно если совпадает "session_id").

Если же изменить вышеприведенную строку кода, по аналогии с тем, как это записано в методе «write» этого же класса, таким образом:

 $query = $this->db->query("SELECT `data` FROM `" . DB_PREFIX . "session` WHERE session_id = '" . $this->db->escape($session_id) . "' AND expire > '" . $this->db->escape(date('Y-m-d H:i:s',time())) . "'"); 

 

То после такого изменения кода все начинает работать правильно.
В этом классе значение переменной «expire», определяющей период хранения сессии, берется из ini файла:

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

Значение у меня равно - 1440 секунд.

И теперь, после исправления, до истечения этого периода возвращается заполненный массив, а после истечения - пустой.

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


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

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

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

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

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

Войти

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

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

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

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

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