На форуме 9558 тем, 76452 сообщений, 44664 участников
тема · 6 346 просмотров · 60 ответов

Opencart3 и MYSQLI_Memcached (Memcached Speed Booster) драйвер проблемы

Общие вопросы
читают: 0 участников и 2 гостя
порядок
28 окт 2019 15:30#1
взял этот модуль

Memcached Speed Booster
https://github.com/volynweb/opencart-memcached-speed-booster

сайты начинают реально летать.
OpenCart 3.0.3.1-rs2
у меня стоит еще Journal3 тема и недавно перевел сайт на PHP 7.2 - это инфа для полной картины.

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

т.е. после введения логин/пароль снова перебрасывает на страницу для входа
при этом в админке пишет, что пользователь "совершил вход"

автор модуля Shaman (Евгений) Lifescale к сожалению c осени 2016 года своих новых координат не дал и на связь пока не выходит и координат его раздобыть не получается.

может кто подскажет куда копать и смотреть, потому что уж очень быстро начинают откликаться сайты с этим драйвером.
28 окт 2019 15:57#2
в данной строке прописано исключение
php
$select_id = (0 <= stripos($sql, 'SELECT') && !stripos($sql, 'FROM ' . DB_PREFIX . 'cart')) ? sha1($sql) : false;

Скорей всего нужно добавить еще и проверку на 'user'
28 окт 2019 16:19#3
Ravilr написал(а): ↑в данной строке прописано исключение
php
$select_id = (0 <= stripos($sql, 'SELECT') && !stripos($sql, 'FROM ' . DB_PREFIX . 'cart')) ? sha1($sql) : false;

Скорей всего нужно добавить еще и проверку на 'user'


имеется ввиду исключить из кэширования корзину.

а добавить 'user' через примерно так: && !stripos($sql, 'FROM ' . DB_PREFIX . 'user'
28 окт 2019 17:37#4
наверное как-то так, через "или" ("||"😉 добавить ?

php
$select_id = (0 <= stripos($sql, 'SELECT') && ( !stripos($sql, 'FROM ' . DB_PREFIX . 'cart') || !stripos($sql, 'FROM ' . DB_PREFIX . 'user') ) ) ? sha1($sql) : false;
28 окт 2019 18:53#5
Ravilr написал(а): ↑в данной строке прописано исключение
php
$select_id = (0 <= stripos($sql, 'SELECT') && !stripos($sql, 'FROM ' . DB_PREFIX . 'cart')) ? sha1($sql) : false;

Скорей всего нужно добавить еще и проверку на 'user'

oc_customer
28 окт 2019 19:38· изменено#7
Chukcha написал(а): ↑oc_customer



php
 $select_id = (0 <= stripos($sql, 'SELECT') && ( !stripos($sql, 'FROM ' . DB_PREFIX . 'cart') || !stripos($sql, 'FROM ' . DB_PREFIX . 'customer') ) ) ? sha1($sql) : false;


попробовал с customer - правильно написал запрос? или может надо как-то по другому?

не хочет заходить (user кстати тоже пробовал).


еще один вопрос по поводу sha1($sql)
в system/library/cart/customer.php вот такая же конструкция для проверки пароля:
php
password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "'))))

и в базе тоже ж два поля password и salt - это может как-то влиять?


Chukcha написал(а): ↑Вообще-то - это плохая идея кеширования в памяти
Все зависит он нагрузки, количества категорий, товаров, числа посетителей

ну с памятью проблем пока нет. есть возможность до гига выделить под memcached.
просто когда видишь как реально ускоряется скорость реакции сайта - очень и очень подкупает.
29 окт 2019 11:52#8
Попробуйте заменить условие, на подобное.

php
$select_id = (0 <= stripos($sql, 'SELECT') ) ? sha1($sql) : false;

if (stripos($sql, 'FROM ' . DB_PREFIX . 'cart')) $select_id = false;

if (stripos($sql, 'FROM ' . DB_PREFIX . 'customer')) $select_id = false;


такая форма записи более удобна для изучения. Т.е если есть селект в запросе, то формируем запрос, а если в последвии видим исключение, то сбрасываем в false

Конечно все условно... нужно посмотреть действительно таблица данная мешает или нет. Возможно еще что то закешировалось лишнее.
29 окт 2019 16:31#9
Ravilr написал(а): ↑Попробуйте заменить условие, на подобное.
такая форма записи более удобна для изучения. Т.е если есть селект в запросе, то формируем запрос, а если в последвии видим исключение, то сбрасываем в false

Конечно все условно... нужно посмотреть действительно таблица данная мешает или нет. Возможно еще что то закешировалось лишнее.


не. все также. не дает зайти в аккаунт.

P.S. причем надо сказать на OpenCart 2.3.0.2 все работает.
29 окт 2019 17:08#10
еще нашел "возможную проблему"

OpenCart 2.3.0.2
стоит тема Journal 2.16.8

так вот она файл
catalog/controller/account/login.php
не трогает.

на OpenCart 3.0.3.1-rs2
стоит Journal 3.0.41
и она в файл
catalog/controller/account/login.php

перед каждым
php
$this->response->redirect($this->url->link('account/account', '', true));


вставила
php
            if (defined('JOURNAL3_ACTIVE')) {
if (\Journal3\Utils\Request::isAjax()) {
echo json_encode(array(
'status' => 'success',
'customer' => $this->customer->isLogged()
), true);

exit;
}
}


может "собака тут порылась"?
29 окт 2019 19:03#13
Мне кажется, что если и применять кеширвоание
то только на больших запросах

это типа getProducts
на малых - смысла нет

Тем более, что, вы не можете управлять временем кеширования, если например вы добавили модуль
Или используете динамическую составлюящую, количество просмотров например

Т.е. полезность этого кеша практически нулевая
Проще смотреть в сторону html кешеров, или кешей данных
29 окт 2019 19:19· изменено#14
убрал модификацию от Journal из login.php - не помогло.


Chukcha написал(а): ↑
Надо смотреть саму модель

логин проходит в либе

модель или библиотеку?

в system/library/cart/customer.php между OpenCart 3.0 и 2.3 есть небольшое различие:
3.0
php
$customer_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "customer WHERE LOWER(email) = '" . $this->db->escape(utf8_strtolower($email)) . "' AND (password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "'))))) OR password = '" . $this->db->escape(md5($password)) . "') AND status = '1'");


2.3
php
$customer_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "customer WHERE LOWER(email) = '" . $this->db->escape(utf8_strtolower($email)) . "' AND (password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "'))))) OR password = '" . $this->db->escape(md5($password)) . "') AND status = '1' AND approved = '1'");


вот этот аппендикс AND approved = '1' может как-то влиять?

в каких модулях и библиотеках еще покопаться стоит?


P.S.
Chukcha написал(а): ↑

Т.е. полезность этого кеша практически нулевая

скорость реакции front-end просто впечатляет с этим драйвером.
пробовал прикрутить другие кэши - но там столько проблем с совместимостью с Journal и другими модулями, что просто голова начинает пухнуть от "допиливания"
29 окт 2019 19:49#16
Chukcha написал(а): ↑
Проще смотреть в сторону html кешеров, или кешей данных

у Journal есть свой модуль кэширования SuperCache, свои minifer`ы css и js

включенны и "обычные" кэши memcached

и даже redis поставил
хотя тоже пришлось "допиливать", чтобы завелся - драйвер из "коробки" выдавал ошибки:
Function Redis::setTimeout() is deprecated
Function Redis::delete() is deprecated

как оказалось
разработчики "слегка промазали" с именем функции
хотя пришлось самом менять delete на del, потому как оказалось delete в redis тоже нет.
29 окт 2019 19:54#17
У меня redis запустился с полпинка

ДЕло не в самом кешировании, а в кешировании атомарных (единичных запросов)
А этот "драйвер" кеширует все данные.. А это 100% глупость
30 окт 2019 00:50· изменено#18
Chukcha написал(а): ↑У меня redis запустился с полпинка

возможно, видать версия PHP и модулей играет роль. а у меня вот нет.
и ведь недаром в коде поменяли SetTimeOut на expire!


Chukcha написал(а): ↑А этот "драйвер" кеширует все данные.. А это 100% глупость

ну если это позволяет конкретно улучшитьвремя отклика сайта - то какой-то смысл в этом есть все же.
тем более кэшируются на 95% статические данные

у меня 2гига памяти на хостинге
под php выделяется только 1 гиг.
Opcache больше 256MБ для сайта тоже нельзя.
256МБ для redis - тоже с головой, вон за сутки работы аж 15МБ насобиралось.
остается еще 512МБ свободной памяти - так почему бы ее не заполнить кэшем "всех данных"?
30 окт 2019 01:05#19
попробовал добавить
code
 AND approved = '1'

выругалось:

code
 PHP Notice:  Unknown column 'approved' in 'where clause'1054SELECT * FROM customer WHERE LOWER(email) = 'email@csa.dp.ua' AND (password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('password'))))) OR password = 'hash_sum_md5') AND status = '1' AND approved = '1' in system/library/db/mysqli_memcached.php on line 108
PHP Notice:  Trying to get property 'num_rows' of non-object in system/library/cart/customer.php on line 52


что и нестранно, ведь действительно колонки approved в таблице customer у OpenCart 3 нет.
30 окт 2019 08:30#20
Chukcha написал(а): ↑то только на больших запросах

это типа getProducts


Вот правильно посоветовали. И для поиска ошибки тоже. Начните тупо с кеширования только больших запросов, а именно пока одного. Сразу и проблема должна исчезнуть.
сообщения 1–20 из 61
Чтобы ответить, войдите или зарегистрируйтесь.

Похожие темы