
Как сделать CS-Cart быстрее? Советы от Alt-team
Друзья,
В Alt-team есть традиция обучать своих коллег тому, что умеешь сам. Раз в месяц мы проводим творческие ITишные встречи, где один и программистов делиться своим опытом в разработке.
В августе 2019 очень интересный доклад на обозрение наших коллег представил один из наших ведущих разработчиков Евгений Шахин. Евгений рассказывал, как сделать CS-Cart магазин быстрее, какой сервер нужно использовать и от чего зависит скорость загрузки страниц CS-Cart движка.
Евгений работает с CS-Cart платформой около 7 лет. К нам он пришел талантливым студентом и уже через пару месяцев работы в компании, Евгению стали доверять масштабные проекты. Ежегодно Евгений успешно проходит официальный тест от CS-Cart, чем подтверждает свою квалификацию.
Итак, доклад Жени был настолько интересный с практической точки зрения, что мы решили на его основе написать статью и поделиться полезными знаниями по оптимизации скорости CS-Cart.
Сразу отмечу, что мы не будем говорить о результатах Google Page Speed Insights. Данный сервис, в основном, проверяет вёрстку. МЫ поговорим о проблемах в настройке сервера, работе MySQL запросов и о методах, как сделать загрузку страниц CS-Cart быстрее.
От чего зависит скорость работы CS-Cart?
- Особенности хостинга
- Веб сервер (Apache, Nginx)
- PHP
- MySQL
- Кэш
- Дополнительное программное окружение
Обычно, мы встречали 3 варианта веб серверов:
- Apache+mod_php (распространенное решение)
- Nginx + php-fpm
- Nginx + Apache + mod_php
Согласно W3Tech.com, от 14 января, 2019, около 85% пользователей используют либо Apache сервер, либо Nginx.При этом Apache все же популярнее Nginx решения.
Давайте поговорим о разнице между Apache и Nginx. Как вы думаете, что быстрее работает? Nginx быстрее при определенных обстоятельствах.
Метод обработки соединений с клиентами | Отдаваемый контент | ||
Apache | один процесс ОС — один запрос | статический и динамический (mod_php) | |
Nginx | один процесс ОС — много запросов |
только статический. Для динамического нужна помощь (php-fpm, apache+mod_php) |
Принимая во внимание все аспекты веб серверов, мы пришли к выводу, что наиболее лучший вариант для высокой производительности CS-Cart — это Nginx в связке с php-fpm, но этот вариант требует перенастройки config файла.
Конечно, Вы можете использовать и Nginx + Apache + mod_php, но данный вариант будет чуть-чуть медленнее. Зато он поддерживает .htaccess файл.
В случае, если у вас уже есть Apache+mod_php и вы хотите увеличь производительность CS-Cart, стоит ли вам переходить на сервер Nginx? Если честно, то стоит это делать, если:
- у вас часто посещаемый интернет-магазин (более 5 посетителей одновременно);
- на страницах много статического контента;
- вы не удовлетворены результатами проверки интернет-магазина на сервисе Google Page Speed Insights.
Если у вас мало посещаемый вебсайт и всего лишь несколько посетителей в день, то вы не почувствуйте разницу от перехода на сервер Nginx.
Но, наш совет, все же использовать Nginx+php-fpm на CS-Cart проектах.
Что насчет PHP?
Коротко, используйте PHP 7 + модуль OPCache!
По умолчанию, CS-Cart использует OPCache модуль, но иногда он отключен! Проверьте это!
OPCache улучшает скорость PHP путем сохранения в памяти прекомпилированный байт-код скрипта. OPCache кэширует и оптимизирует сгенерированный байт код.
ВНИМАНИЕ! Поддержка PHP 7.3. начинается только в CS-Cart 4.9. версии и выше.
Вы должны осознавать, что сам по себе PHP не является узким местом в производительности CS-Cart. Да, несомненно, что PHP 7 быстрее PHP 5, но версия PHP не оказывает такого влияния на скорость загрузки страниц CS-Cart, как MySQL запросы.
Итак, мы переходим к самой главной части в теме Как увеличить скорость работы CS-Cart — MySQL запросы!
Обычно, CS-Cart работает очень быстро после открытия интернет-магазина. Первые проблемы начинаются, когда администратор интернет-магазина начинает загружать товары в магазин. Чем больше товаров, тем медленнее становится магазин. Со временем (когда много товаров уже загружено, много блоков) скорость CS-Cart магазина очень сильно падает и это уже сложно не заметить. Как раз в этом случае к нам обращаются владельцы интернет-магазинов на CS-Cart, которым просто необходим "летающий" интернет-магазин.
Почему скорость CS-Cart падает, как только вы начинаете пользоваться платформой?
- Слишком сложные итоговые запросы.
Сказать по правде, это очень плохой запрос! Не для всех частей запроса используются индексы. В условиях запроса используются функции MySQL. Обратите внимание на часть с FIND IN SET и оператором OR! Оператор OR нужно использовать очень осторожно, он может создавать множественные запросы. Вы никак не сможете использовать индексы в данном запросе.
- Использование SQL_CALC_FOUND_ROWS. В таком случае запрос выполняется, игнорируя LIMIT.
- При определенных обстоятельствах это приводит к блокировкам. (Например, сортировка по популярности, вывод блоков основанных на данных продаж и т.д.).
Итак, как увеличить скорость работы CS-Cart с помощью работы над MySQL запросами и блокировками?
MySQL запросы.
Лечение причин.
- Качественное решение — реализация индексации продуктов в том или ином виде. В то же время —сложное и подойдет не всем.
- Компромиссное — упростить итоговый запрос и оставить только компоненты использующие индексы —станет намного лучше.
Лечение симптомов.
- Увеличение размеров буферов в конфигурации MySQL (join_buffer_size и т.п.), в совокупности с апгрейдом RAM.
- Кеширование блоков с продуктами и полностраничное кэширование.
MySQL блокировки.
Блокировки делятся на 2 типа: блокировки на чтение и блокировки на запись.
- Если A хочет читать данные, то другие клиенты тоже могут читать данные, но никто не может записывать, пока А не закончит чтение (read lock).
- Если А хочет записать данные, то другие клиенты не могут ни читать, ни писать данные, пока А не закончит(write lock).
По умолчанию, CS-Cart использует MyISAM систему хранения данных в СУБД MySQL. Данная система хоть и стара, но отлично и стабильно работает. Единственный огромный минус — это блокировка всей таблицы. Чтобы решить данную проблему, была изобретена другая система хранения данный — InnoDB. InnoDB использует более совершенный алгоритм блокировок. Система блокирует не всю таблицу, а только используемую строку.
Главная проблема CS-Cart — это использование системы MyISAM по умолчанию, что очень часто приводит к блокировкам таблиц полностью.
Примеры блокировок таблиц.
- Первый клиент открывает категорию с сортировкой по популярности. (блокируется таблица products_popularity по read lock). Другой клиент хочет открыть страницу продукта, но ждет первого, т.к. надо изменить значение популярности продукта.
- Клиенты постоянно лочат таблицы сессий по write lock (можно и нужно перенести в другое хранилище.
- Клиенты регулярно лочат по write lock таблицы статистики, логов, ордеров.
- Бекап БД создает read lock. Дольше всего бэкапятся самые нежелательные таблицы для лока.
- Синхронизация продуктов с внешней системой создает write lock на таблице продуктов. Например, синхронизация с 1С может работать до получаса.
Лечение причин.
Конвертация таблиц в InnoDB или XtraDB (форк InnoDB от Percona) и сопутствующее редактирование конфига MySQL (установить innodb_buffer_pool_size и innodb_log_buffer_size в соответствии c RAM).
Лечение симптомов.
Кеширование в любом из своих проявлений сгладит ситуацию, но не устранит проблему.
MySQL. Конфигурационный файл.
Что можно поменять?
- Адаптировать значения настроек в соответствии с имеющейся RAM. В первую очередь, это касается значения буферов.
- Можно включить кэширование запросов. Но осторожно.
Как поменять?
- Утилита Mysqltuner https://github.com/major/MySQLTuner-perl
-
Посмотреть рекомендации по основным настройкам в слайдах от Percona https://www.percona.com/resources/technical-presentations/optimizing-mysql-configuration-mysql-56-percona-technical-webinars
Когда менять?
- Если у клиента мощный сервер и до этого настройка не проводилась.
- Если провели конвертацию в InnoDB
О кэшировании!
- Мы не рекомендуем делать кэширование на уровне базы данных!
- Можно делать кэширование на уровне CS-Cart (блоки, промежуточные данные). Можно перенести все это на Redis.
- Полностраничное кэширование. Уже есть готовое решение Кеш для пользователей.
Дополнительные программы
- Используйте Redis для кеша и сессий. Redis is data caching technology. It caches data into RAM, so it's quickly accessed.
- Можно использовать Sphinx для поисковой оптимизации по сайту, но полнотекстовый поиск MySQL для большинства проектов не хуже.
- Используйте Varnish кеш для полностраничного кеширования.
Как тестировать сайт на предмет проблем со скоростью?
1. Необходимо включить дебагер!
Постоянно
В файле config.local.php или local_conf.php вставить строчку:
define('DEBUG_MODE', true);
В этом случае дебагер будет работать всегда и везде. Отключить его можно, заменив true на false, или совсем убрав определение константы.
Временно
- Войти в панель администратора как root-администратор.
- В URL дописать параметр, например:
http://example.com/admin.php?debug
Так дебагер включится только для данной сессии. Чтобы выключить его, наведите курсор на логотип CS-Cart на панели дебагера вверху. Чуть левее логотипа появится кнопка выключения.
2. С помощью ресурса loaddy.com
Если нужна помощь для решения проблем со скоростью CS-Cart, то мы с удовольствием поможем!
Оставьте заявку по кнопке выше или напишите нам на почту manager@alt-team.com
Комментарии
Сообщения не найдены
Новое сообщение
Информация о компании
E-mail:
manager@alt-team.com
Рабочие часы:
Понедельник-Пятница, с 9:00 по 18:00 (Московское время)
Адрес:
432072, Ульяновск, Ульяновский проспект, дом 10.
Skype чат
Skype логин: altteam
(Только чат)