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

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


Recommended Posts

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

Мне кажется, что механизм сессий в 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 секунд.

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

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


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

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

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

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

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

Вхід

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

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

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

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

Important Information

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