Кейс — тормозит сайт на OpenCart 1.5, а на сервер оказывается ощутимая нагрузка.
Проанализировав, что происходит при открытии страниц сайта, обнаружилось следующее.
При открытии любой страницы каталога происходят десятки однотипных SQL-запросов вида:
SELECT COUNT(DISTINCT p.product_id) AS total FROM oc_category_path cp LEFT JOIN oc_product_to_category p2c ON (cp.category_id = p2c.category_id) LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= '2016-09-16 11:24:00' AND p2s.store_id = '0' AND cp.path_id = '721'
Эти запросы формируются функцией getTotalProducts
, которая служит для подсчёта общего количества продуктов. Находится функция в файле catalog/model/catalog/product.php.
При открытии страниц каталога функция вызывается из файлов:
system/library/themeoptions.php
catalog/controller/common/header.php
catalog/controller/product/category.php
После отключения вызова функции в этих файлах (заменили строку $product_total = $product->getTotalProducts($data);
на $product_total = 0;
) сайт стал работать существенно быстрее, нагрузка на сервер снизилась в разы, а страницы стали открываться в 3-4 раза быстрее. На функционале сайта, на первый взгляд, ничего не изменилось - всё выглядит точно так же.