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

babahalki

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

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

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

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

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

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

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

Мы сделали так. Кешируем тяжелые методы 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;
     }
 
Скажи, а ты в каком месте кеш собираешь? index.php на fetch view?
Если мне память не изменяет - инклудом php (включаем в смарти) в index.tpl

-> кешируется не запрос, а html страница с результатом
 
Мы сделали так. Кешируем тяжелые методы 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;
     }
Это самое оптимальное решение, проверка по хэшу и актализация чере крон, по другому я не вижу как тут сделать оптимальнее. Очень строго стоит вопрос актуальности кэша...
 
Есть ли подвижки с модулем кэширования?
 
Мне тоже интересно, как организовать кеширование. Магазин на 90% статичен, сортировки/фильтров/блока "вы просматривали". Корзины нет. И генерация html кода (например, главной страницы, которая на 100% статична) занимает по полсекунды. А хотелось бы так: обратился - закешировалось, обратился следующий пользователь - выдало из кеша.

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