Статьи  : 

Оптимизация opencart 1.5

11 августа 2015, 08:00

Постановка задачи



Имеется интернет-магазин, выполненный на opencart 1.5. У сайта наблюдается долгое время загрузки страниц, что явно говорит о том, что имеются проблемы с его производительностью. Наша задача: выявить источник проблемы и, исходя из него, провести необходимую оптимизацию сайта.

Теория



Вообще говоря, на скорость загрузки страниц влияет довольно много факторов, в частности:

В серверной части:

- оптимизация базы (структура, индексы)
- оптимальность кода (излишние циклы, избыточные массивы и так далее)
- наличие кеширования

В клиентской части:

- минимизация траффика (сжатие изображений, яваскриптов, стилей css)
- минимизация количества запросов, необходимых для загрузки страницы (склейка всех файлов js и css)
- и ряд других

Далее в нашей статье мы опишем работы, проведенные с серверной частью сайта ( так называемым "бэкендом" ).

Практика



Для начала, так как "движок" опенкарта является открытым, то мы считаем, что его код более-менее оптимален по скорости работы, потому что проверен и перепроверен большим количеством людей. Поэтому данный пункт мы пропускаем.

Перейдем к анализу базы. Сразу бросается в глаза очень малое количество индексов по полям таблиц (в некоторых случаях наличие индекса может многократно ускорить выборку из базы данных). Поэтому вручную проходим по всем таблицам и добавляем их на подходящие поля. Здесь пригодится простое правило: если в названии поля присутствует суффикс "_id" (например, customer_id), то это явно связка с другой таблицей, и сюда нужно добавить индекс. Например, таблица заказов "order" после оптимизации получила следующие дополнительные индексы:

shipping_country_id
payment_country_id
shipping_zone_id
payment_zone_id
store_id
customer_id
customer_group_id
order_status_id
affiliate_id
language_id
currency_id

Некоторая избыточность нам не повредит, так как база преимущественно работает в режиме чтения, а не в режиме записи (обновление индексов выполняется долго именно при записи данных).

После прохода по таблицам базы перейдем к вопросу кеширования данных. Для начала нам потребуется установить модуль-профайлер – скрипт, который показывает внизу любой интересующей нас страницы сводную статистику: какие запросы к базе выполнялись, как долго, сколько памяти было использовано (инструкция по установке доступна в этой статье). Первое включение сразу же показывает серьезную проблему:

Статистика страницы до оптимизации опенкарта
Статистика страницы до оптимизации опенкарта



778 запросов к базе на одной странице – вот почему тормозит наш opencart! Просто немыслимо! При этом и выборка из базы идет 0.11 сек, что тоже очень и очень много.

Включим в работу файловое кеширование данных. Для этого в опенкарте есть файл system/library/cache.php, в котором реализованы следующие методы:

get – получить данные из кеша (если они там есть)
set – записать данные в кеш

На их использовании мы и выполним всю систему кеширования. Алгоритм выглядит следующим образом (на примере подсчета количества товаров):

$cache = md5(http_build_query($data));
$total = $this->cache->get( (int)$this->config->get( 'config_language_id' ) . '.' .
(int)$this->config->get( 'config_store_id' ) . '.' . (int)$customer_group_id . '.' .
$cache, 'total_products' );
		
if (false === $total)
{
    // тут проводим выборку из базы, как было раньше

    $this->cache->set( (int)$this->config->get( 'config_language_id' ) . '.' .
    (int)$this->config->get( 'config_store_id' ) . '.' .  (int)$customer_group_id . '.' .
    $cache, $total, 'total_products' );
}


Как видно, сначала мы сформировали ключ, и по нему проверили наличие кеша. Если кеш не обнаружен – делаем, как раньше, необходимые выборки из базы, обрабатываем данные и записываем в кеш.

Для очистки устаревших данных в cache.php нами был добавлен метод clear_obsolete, который просто запускается раз в десять минут и удаляет весь накопленный кеш. Для данного вида кеширования это является наиболее подходящим решением (остальные варианты сильно усложнили бы код).

После всех изменений в коде наша статистика стала выглядеть вот так:

Статистика страницы после оптимизации опенкарта
Статистика страницы после оптимизации опенкарта



Как видно, число запросов к базе сократилось с 778 до 17 (!!), а время – с 0.11 до 0.0016 сек. При этом не только ускорилась загрузка страниц, но и уменьшилась нагрузка на сервер, так как данные в кеше хранятся уже в обработанном виде.

Выводы



В ходе выполнения задачи мы смогли ускорить opencart за счет оптимизации серверной части – использования индексов в базе и кеширования данных, получаемых из нее. В результате уменьшилось время генерации страниц, их загрузка стала выполняться быстрее. Отдельным плюсом стало снижение нагрузки на хостинг, что позволило сохранить имеющийся тарифный план, а не переходить на более дорогой.

Читайте также: производительность кеша в Opencart 1.5
Если ваш интернет-магазин на opencart также тормозит, и вы хотите заказать его оптимизацию у нас – пожалуйста, свяжитесь с нами через форму обратной связи.