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

Тема в разделе "Общие вопросы", создана пользователем AndreyPopov, 28 окт 2019.

  1. AndreyPopov

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8
    взял этот модуль

    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 года своих новых координат не дал и на связь пока не выходит и координат его раздобыть не получается.

    может кто подскажет куда копать и смотреть, потому что уж очень быстро начинают откликаться сайты с этим драйвером.
     
  2. Ravilr

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    в данной строке прописано исключение
    PHP:
    $select_id = (<= stripos($sql'SELECT') && !stripos($sql'FROM ' DB_PREFIX 'cart')) ? sha1($sql) : false;
    Скорей всего нужно добавить еще и проверку на 'user'
     
  3. AndreyPopov

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8
    имеется ввиду исключить из кэширования корзину.

    а добавить 'user' через примерно так: && !stripos($sql, 'FROM ' . DB_PREFIX . 'user'
     
  4. AndreyPopov

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8
    наверное как-то так, через "или" ("||") добавить ?

    PHP:
    $select_id = (<= stripos($sql'SELECT') && ( !stripos($sql'FROM ' DB_PREFIX 'cart') || !stripos($sql'FROM ' DB_PREFIX 'user') ) ) ? sha1($sql) : false;
     
  5. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    oc_customer
     
    Ravilr нравится это.
  6. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    Вообще-то - это плохая идея кеширования в памяти
    Все зависит он нагрузки, количества категорий, товаров, числа посетителей
     
  7. AndreyPopov

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8

    PHP:
     $select_id = (<= 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(saltSHA1(CONCAT(saltSHA1('" . $this->db->escape($password) . "'))))
    и в базе тоже ж два поля password и salt - это может как-то влиять?




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

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    Попробуйте заменить условие, на подобное.

    PHP:
    $select_id = (<= 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

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

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8
    не. все также. не дает зайти в аккаунт.

    P.S. причем надо сказать на OpenCart 2.3.0.2 все работает.
     
  10. AndreyPopov

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8
    еще нашел "возможную проблему"

    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;
                    }
                }
    может "собака тут порылась"?
     
  11. Ravilr

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    возможно. Не подскажу тут... я журнал обхожу стороной за километр...
     
  12. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    Не думаю,

    Надо смотреть саму модель

    логин проходит в либе
    Затем sha1 разный
    так что.. анализируйте
     
    Последнее редактирование: 29 окт 2019
  13. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    Мне кажется, что если и применять кеширвоание
    то только на больших запросах

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

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

    Т.е. полезность этого кеша практически нулевая
    Проще смотреть в сторону html кешеров, или кешей данных
     
  14. AndreyPopov

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8
    убрал модификацию от Journal из login.php - не помогло.


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

    в 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.
    скорость реакции front-end просто впечатляет с этим драйвером.
    пробовал прикрутить другие кэши - но там столько проблем с совместимостью с Journal и другими модулями, что просто голова начинает пухнуть от "допиливания"
     
    Последнее редактирование: 29 окт 2019
  15. Chukcha

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    извините
    Ежики плакалаи, кололись, но продолжали жрать кактусы
     
  16. AndreyPopov

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8
    у Journal есть свой модуль кэширования SuperCache, свои minifer`ы css и js

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

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

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

    Chukcha Специалист

    Сообщения:
    3.013
    Симпатии:
    685
    У меня redis запустился с полпинка

    ДЕло не в самом кешировании, а в кешировании атомарных (единичных запросов)
    А этот "драйвер" кеширует все данные.. А это 100% глупость
     
  18. AndreyPopov

    AndreyPopov Пользователь

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


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

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

    AndreyPopov Пользователь

    Сообщения:
    49
    Симпатии:
    8
    попробовал добавить
    Код:
     AND approved = '1'
    выругалось:

    Код:
     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 нет.
     
  20. Ravilr

    Ravilr Специалист

    Сообщения:
    3.877
    Симпатии:
    1.064
    Вот правильно посоветовали. И для поиска ошибки тоже. Начните тупо с кеширования только больших запросов, а именно пока одного. Сразу и проблема должна исчезнуть.