Помощь УСКОРЯЕМ SIMPLA

babahalki

Постоялец
Регистрация
6 Май 2016
Сообщения
247
Реакции
107
Привет всем.
Те, у кого большой магазин наверняка заметили, что разделы открываются весьма неспешно. У нас в магазине приличное количество товаров (60000) и довольно много параметров, выведенных в фильтры.

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

Самые проблемные по скорости методы, которые срабатывают при заходе в раздел get_options (для формирования фильтров) и count_products(для пагинации).

count_products можно ускорить за счет создания общей таблицы всех свойств товаров и подсчета товаров из нее, это позволит получить еще секунду или полторы скорости, но что делать с get_options?

Может кто-то знает как делается в мощных cms?

Может быть пойти по пути кэширования сгенерированных html? Только как это сделать?
 

babahalki

Постоялец
Регистрация
6 Май 2016
Сообщения
247
Реакции
107
Я кеширую тяжелые страницы через плагин

Для просмотра ссылки Войди или Зарегистрируйся

Мы сделали так. Кешируем тяжелые методы get_products get_options count_products get_images, ключ для кеша - само название метода и его параметры. Чтобы кеш обновлялся сделали сейчас так.

При обращении к методу проверяется есть ли уже кеш, если кеш есть, выдаем данные из кеша, а в очередь заданий записываем обновить кеш. cron запускает каждую минуту выполнятель очереди и берет оттуда 5 задач.
Вот пример отредактированного метода get_products
Код:
  public function get_products($filter = array()) {
     //phpfastcache
     global $cache;
     if($cache && !$filter['nocache']) {
     $key = "get_products"."_".hash(MD4, serialize($filter));
     $get_products = $cache->get("$key");
     
     //подключаем класс очереди
     require_once('queue.php');
     //ставим параметр не использовать кеш
     $filter['nocache'] = 1;
     
     //заводим переменную класса queue
     $queue = new simpleq();
     
     //пишем массив параметров фильтра в строку в формате array($key=>$val)
     $filter = var_export($filter,true);
     
     //создаем переменную для задачи, соединяя между собой нужную функцию и массив параметров
     $task = '$okay->products->get_products(';
     $task .= $filter;
     $task .= ');';
     
     //пишем в базу сформированное задание
     $queue->addtask($task);
     dtimer::log(__METHOD__ . ' get from cache ' . __LINE__);
     
     // если есть берем данные из кеша и заканчиваем выполнение функции
     if($get_products) return $get_products;
     }
 

Jake Foley

Мой дом здесь!
Регистрация
14 Дек 2006
Сообщения
747
Реакции
395
Скажи, а ты в каком месте кеш собираешь? index.php на fetch view?
Если мне память не изменяет - инклудом php (включаем в смарти) в index.tpl

-> кешируется не запрос, а html страница с результатом
 

santaatnas

Создатель
Регистрация
14 Янв 2016
Сообщения
16
Реакции
2
Мы сделали так. Кешируем тяжелые методы get_products get_options count_products get_images, ключ для кеша - само название метода и его параметры. Чтобы кеш обновлялся сделали сейчас так.

При обращении к методу проверяется есть ли уже кеш, если кеш есть, выдаем данные из кеша, а в очередь заданий записываем обновить кеш. cron запускает каждую минуту выполнятель очереди и берет оттуда 5 задач.
Вот пример отредактированного метода get_products
Код:
  public function get_products($filter = array()) {
     //phpfastcache
     global $cache;
     if($cache && !$filter['nocache']) {
     $key = "get_products"."_".hash(MD4, serialize($filter));
     $get_products = $cache->get("$key");
    
     //подключаем класс очереди
     require_once('queue.php');
     //ставим параметр не использовать кеш
     $filter['nocache'] = 1;
    
     //заводим переменную класса queue
     $queue = new simpleq();
    
     //пишем массив параметров фильтра в строку в формате array($key=>$val)
     $filter = var_export($filter,true);
    
     //создаем переменную для задачи, соединяя между собой нужную функцию и массив параметров
     $task = '$okay->products->get_products(';
     $task .= $filter;
     $task .= ');';
    
     //пишем в базу сформированное задание
     $queue->addtask($task);
     dtimer::log(__METHOD__ . ' get from cache ' . __LINE__);
    
     // если есть берем данные из кеша и заканчиваем выполнение функции
     if($get_products) return $get_products;
     }
Это самое оптимальное решение, проверка по хэшу и актализация чере крон, по другому я не вижу как тут сделать оптимальнее. Очень строго стоит вопрос актуальности кэша...
 

wizard-1978

Создатель
Регистрация
27 Ноя 2014
Сообщения
32
Реакции
7
Есть ли подвижки с модулем кэширования?
 

135

Постоялец
Регистрация
11 Июл 2010
Сообщения
141
Реакции
8
Мне тоже интересно, как организовать кеширование. Магазин на 90% статичен, сортировки/фильтров/блока "вы просматривали". Корзины нет. И генерация html кода (например, главной страницы, которая на 100% статична) занимает по полсекунды. А хотелось бы так: обратился - закешировалось, обратился следующий пользователь - выдало из кеша.

Решение: Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование модератором:

acidpepper

Создатель
Регистрация
27 Апр 2014
Сообщения
28
Реакции
4
Интересует готовый модуль кеширования
 
Сверху