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

Вопос по сесссиям


Xelen

Recommended Posts

Хочу посоветоваться со спецами)

Купила на opencart.com  один модуль я, для доставки.

И он конфликтует с симплой, при перезагрузке полей сбрасывается сессия на сайте и в админке.

Разработчик того модуля предложил мне решение прописать в

в файлах system/config/catalog.php и system/config/admin.php  в конце следующую строчку:
$_['session_engine'] = 'file'; 

 

Вроде теперь не сбрасывает сессии, все работает.

Но есть сомнения насчет того, не повлияет ли это на что-либо ещё.

Насколько корректно такое решение вопроса?

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

10 минут назад, Xelen сказал:

Купила на opencart.com  один модуль

В мусорку такие модули с граблями
Не понятно что он там с сессией делает, а на "обработке" сессий построена работа всех кешировщиков  и других модулей тоже
Это значит модуль своими ошибками мешает работе

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

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

В мусорку такие модули с граблями
Не понятно что он там с сессией делает, а на "обработке" сессий построена работа всех кешировщиков  и других модулей тоже
Это значит модуль своими ошибками мешает работе

 

да мне самой все это не нравится. Но вариантов нет особо по этому вопросу.

на стандартном чекауте опенкарт он ничего не сбрасывает, а в симпле именно скрипт перезагрузки полей + этот модуль . вырубают сессию.

так понимаю, конфликт скриптов. может есть какой-то вариант заставить скрипты не конфликтовать?

не возвращаться же мне к станадартному чекауту)

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

дело оказалось не в конфликте скриптов.

Там у него способ доставки передает пустое значение отображаясь, в селекте выбора адресов нет даже дефолтного значения -выберите- ( интересно,это может быть причиной сброса сессии?)

а скрипт перезагрузки просто показывает то, что уже произошло.

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

может кто подскажет, в файле или таблице сессий вообще должен храниться скрипт из модели, помимо самой информации из селекта адресов доставки?

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

13 минут назад, Xelen сказал:

может кто подскажет, в файле или таблице сессий вообще должен храниться скрипт из модели, помимо самой информации из селекта адресов доставки?

Повторите вопрос
в сессии может храниться информация о shipping_method
 

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

18 минут назад, chukcha сказал:

Повторите вопрос
в сессии может храниться информация о shipping_method
 

 

у меня модуль доставки обнулял сессию из-за слишком большого объема данных.

В этом модуле передается список адресов поставщика услуги доставки.

сначала перевели сессии на файл, но потом я решила увеличить размер поля в БД

Размер поля в БД я увеличила, все работает.

Но мне было любопытно, что так забивает сессию, я заглянула в файл иу видела, что помимо данных адресов поставщика, вот таких

<option value="omniva.omniva_9946">адрес</option>
<option value="omniva.omniva_9902">адрес1</option>
<option value="omniva.omniva_9884">адрес2</option>

 

там в конце в поле сессии , где эти адреса, ещё и передается целый скрипт, который прописан в файле модели каталога. этот скрипт отвечает за работу селекта.

Я без понятия, должен ли передаваться в сессию Js  код? Это корректно?

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

Да, есть такое, к сожалению, причина - в идеологии оформления заказа опенкарта

По сути нужен аякс скрипт для таких селектов

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

2 часа назад, chukcha сказал:

Да, есть такое, к сожалению, причина - в идеологии оформления заказа опенкарта

По сути нужен аякс скрипт для таких селектов

 

А как очищать сессии из БД?

Там месяцами накапливаются мегабайты истекших сессий

Это как-то удаляется через Опенкарт?

Я вижу в файле system/library/session/db.php код

public function destroy($session_id) {
		$this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE session_id = '" . $this->db->escape($session_id) . "'");
		
		return true;
	}

только не могу понять, что его запускает? Есть какая-то кнопка?

настройка session.gc_maxlifetime = 3600;

 

И то же самое, если сессии переключить на файл

public function destroy($session_id) {
		$file = DIR_SESSION . '/sess_' . basename($session_id);

		if (is_file($file)) {
			unset($file);
		}
	}

 

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

  • 1 year later...

На дворе 2020, а я столкнулся с той же проблемой сессий. Удивляет сам факт, что почти за два года проблему так и не пофиксили. Посмотрел репозиторий opencart-а на github-и вроде бы работа идёт полным ходом, хотя ветка 3.0.x какая-то заброшенная и активно идёт работа над веткой 3.1.x. Не значит ли это, что ветка 3.0.x обречена и все фиксы делаются в 3.1.x?

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


По-хорошему, файл system/library/session/db.php должен быть таким:

<?php
/*
CREATE TABLE IF NOT EXISTS `session` (
  `session_id` varchar(32) NOT NULL,
  `data` mediumtext NOT NULL,
  `expire` datetime NOT NULL,
  PRIMARY KEY (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
*/
namespace Session;
final class DB {
	public $expire = '';

	public function __construct($registry) {
		$this->db = $registry->get('db');

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

	public function read($session_id) {
		$query = $this->db->query("SELECT `data` FROM `" . DB_PREFIX . "session` WHERE session_id = '" . $this->db->escape($session_id) . "' AND expire > now()");

		if ($query->num_rows) {
			return json_decode($query->row['data'], true);
		} else {
			return false;
		}
	}

	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 = DATE_ADD(NOW(), INTERVAL " . $this->expire . " SECOND)");
		}

		return true;
	}

	public function destroy($session_id) {
		$this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE session_id = '" . $this->db->escape($session_id) . "'");

		return true;
	}

	public function gc() {
		$this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE expire <= now()");

		return true;
	}
}

Тут на самом деле три фикса:

  1. Более правильная работа с полем expire, используя только возможности MySQL.
  2. Для поля data следует использовать гораздо больше, чем 64Кб (т. е. вместо TEXT лучше юзать MEDIUMTEXT, чего вполне должно хватить на все случаи жизни). На практике у меня ломались сессии из-а того, что накапливалось около 1Мб сессионных данных и они тупо не сохранялись из-за чего в магазине происходила мистика.
  3. В метод gc() нет необходимости передавать параметр.

Обратил внимание, что даже в master-ветке opencart-а на github-е, фиксы какие-то странные. Хотелось бы услышать критику по этим фиксам и может я что-то не учёл.

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


4 часа назад, Taaliman сказал:

На дворе 2020, а я столкнулся с той же проблемой сессий.

 

часто решается заменой /system/library/session.php от прошлой версии движка, сам недавно столкнулся.

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

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

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

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

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

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

Вхід

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

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

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

Important Information

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