Как без особых технических навыков увеличить производительность CS-Cart и CS-Cart для маркетплейсов

Роман Ананьев
Head of Cloud Hosting at simtechdev.com

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

Все рекомендации и действия по оптимизации проектов, представленные в этой статье, могут нарушить работу магазина. Поэтому мы просим быть максимально аккуратными в своих действиях и, если что-то пошло не так, отменить ваши предыдущие действия и обратиться за помощью к специалистами CS-Cart или вашего хостинга с описанием того, что привело к проблеме.

1. Обновите CS-Cart или Multi-Vendor, все темы и модули

Обновление ядра CS-Cart, тем и модулей важно, потому что в новых версиях есть патчи производительности, патчи для улучшения и оптимизации процессов работы и для исправления багов и уязвимостей.

2. Обновите версию PHP и используйте его возможности

Найдите максимальную версию PHP, поддерживаемую вашей версией CS-Cart или Multi-Vendor.

Нагрузочные тесты, проведенные нами на последней версии CS-Cart и дефолтной теме без сторонних модулей, показывают, что производительность проекта можно увеличить, обновив версию PHP.

image1

Отдельно хочется обратить внимание на то, что не все модули и версии CS-Cart поддерживают последние версии PHP, а это может привести к временной недоступности магазина. Перед обновлением вашего живого проекта мы рекомендуем провести проверку обновления локально или на тестовом сервере, ну или обратиться к разработчикам.

Используйте OPcache

Как работает PHP приложение? PHP открывает файлы с кодом, собирает их воедино, анализирует, токенизирует и компилирует, а затем выполняет. Так как файлов много, процесс их открытия, чтения и компиляции может отнимать значительные ресурсы. Но поскольку файлы меняются не так часто, то компиляцию каждый раз можно и не делать. Оптимальнее ее совершить один раз, закэшировать результат и после этого обращаться к нему.

Как раз это и делает модуль OPcache. Он сохраняет результат компиляции в кэш, чтобы потом работать с ним, а не генерировать его снова и снова. Таким образом, это ускоряет работу PHP за счет отсутствия процесса компиляции. А когда ваш код изменится, модуль OPcache сам инвалидирует кэш и совершит компиляцию снова. И это без необходимости его настраивать!

Используйте FastCGI

FastCGI — это один из вариантов подключения PHP к веб-серверу. PHP-FPM (FastCGI контейнер для PHP) и NGINX по умолчанию поддерживают совместную работу и сконфигурированы для максимальной производительности друг с другом без дополнительных прослоек.

Некоторые любят использовать Apache с модулем mod_php как веб-сервер или NGINX + Apache (mod_php) + PHP. Да, Apache дает возможность использовать .htaccess файлы, которые любят начинающие администраторы, но это влияет на производительность примерно на 3-7% по сравнению со связкой NGINX + PHP-FPM. Мы рекомендуем отказываться от Apache, тем более что его первоначальные настройки уязвимы для ряда атак.

Ограничьте PHP и изучите каждый параметр, который планируете менять

Да, как это странно ни звучит, но выставлять максимальные настройки для PHP — не всегда хорошее решение. Если вы выделяете больше памяти или не ограничиваете время выполнения каких-либо процессов, то другим компонентам системы может не хватить ресурсов, или они будут конкурировать друг с другом, пока за ними не придет OOM Killer 🙂

max_execution_time: 60

Мы не рекомендуем выставлять время работы скрипта больше 1 минуты для обычных процессов. Но такие процессы как импорты, экспорты и обновления CS-Cart бывают долгими и для этих процессов иногда может потребоваться увеличение “таймаутов” на стороне PHP и MySQL.

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

memory_limit: «512M»

Не стоит устанавливать этот параметр слишком большим, так как OOM Killer будет в этом случае приходить за всем PHP сразу. И не забывайте, что у вас есть еще MySQL и какие-то еще компоненты – им тоже нужна память, а еще самой системе для работы нужна память.

Увеличивайте memory_limit только в крайних случаях.

3. Обновите и оптимизируйте базу данных (MySQL)

Переконвертируйте все таблицы из MyISAM в InnoDB

Это позволит базе данных при тяжелых и долгих запросах блокировать не всю таблицу, а только строки, с которыми идет работа. Попросите вашего хостера или системного администратора провести миграцию таблиц из MyISAM в InnoDB.

Вот главные отличия InnoDB и MyISAM:

  • InnoDB поддерживает блокировки уровня строки, а MyISAM — только уровня таблицы).
  • InnoDB поддерживает так называемую «целостность по ссылке», что включает поддержку ограничения внешних ключей (RDBMS), а MyISAM нет (DMBS).
  • InnoDB более надежна, так как использует журнал транзакций для автовосстановления, а MyISAM нет.

Оптимизируйте настройки MySQL

Многие параметры нужно выставлять в зависимости от объема оперативной памяти, поэтому в рамках этой статьи мы не сможем дать точные значения, но укажем направление для исследования и размышления.

wait_timeout: 60

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

Очень часто причиной долгих запросов является проблема при его проектировании. Я рассказывал об этом в блоге Simtech Development.

Проверьте конфигурацию при помощи MySQLtuner

Проверьте конфигурацию и проанализируйте результат выполнения скрипта MySQLtuner. Возможно, некоторые оптимизации вам необходимы, если вам нужна помощь — обратитесь к нам, мы поможем .

4. Увеличьте мощности сервера

Не все проблемы с производительностью сайта можно решить увеличением параметров конфигурационных файлов PHP, MySQL или обновлением серверного ПО. Иногда наступает момент когда нужно задуматься о повышении мощности сервера или тарифного плана у вашего хостера. Это может быть установка дополнительных аддонов, увеличение количества товаров или просто рост количества посетителей вашего сайта.

Также мы рекомендуем повышать мощности сервера на периоды распродаж и маркетинговых акций.

5. Используйте HTTP/2 соединение (и TLS 1.3)

Производительность в данном случае идет рядом с безопасностью. Протокол HTTP/2 (который доступен только для https соединений) уже значительно оптимизирован по сравнению с HTTP 1.1, так что простое внедрение этой спецификации способно улучшить производительность вашего проекта.

6. Твики и опции CS-Cart

В случае, если после внесения изменений у вас стал недоступен проект — отмените изменения и обратитесь к технической поддержке CS-Cart и вашему хостеру. Они помогут вам с настройкой.

Используйте Imagick

GD и Imagick — это два независимых друг от друга расширения PHP для работы с графикой. Оба модуля очень схожи, однако Imagick дает более качественный результат при создании миниатюр изображений. При этом используя меньше памяти.

Для того, чтобы включить Imagick, измените в массиве $config[‘tweaks’] файла config.local.php значение твика на imagick, как показано на скриншоте:

400c32dccf54102dc3be243db15aaf4a

'image_resize_lib' => 'imagick',

Также обратите внимание на то, что если у вас в файле config.local.php напротив image_resize_lib стоит auto, то если у вас установлен imagic, то он будет использоваться по умолчанию.

Включите APCu для кэша и Redis для хранения сессий

Мы рекомендуем использовать APCu для хранения кэша в CS-Cart и Redis для хранения сессий. Обратите внимание на то, что подобное разделение снизит нагрузку на базу данных и диск, но добавит возможную точку отказа в виде дополнительного сервиса, работу которого нужно отслеживать тоже. А перенос кэша в APCu увеличит хотелки PHP 🙂

$config['cache_backend'] = 'apcu';
$config['session_backend'] = 'redis';

Включение этих параметров в конфигурационном файле требует преднастроенных APCu в PHP 7.0+ и Redis на вашем сервере. Перед изменением конфигурационного файла убедитесь что APCu и Redis  у вас доступны для использования на сервере. В случае если вы не уверены или не знаете точно, обратитесь к системному администратору или хостеру для их настройки.

Для бэкапов используйте mysqldump

Mysqldump — это серверное расширение, которое установлено на всех современных хостингах, и все администраторы рекомендуют использовать его для создания бэкапов базы данных. Для бэкапов используйте mysqldump.

Для того, чтобы включить его, добавьте параметр backup_db_mysqldump со значением true в массив $config[‘tweaks’] или измените в файле config.local.php значение твика на true, как показано на скриншоте:

400c32dccf54102dc3be243db15aaf4a (1)

'backup_db_mysqldump' => false,

Добавьте блокировку бэкэнда для процессов генерации кэша

В последних версиях CS-Cart появилась возможность блокировать бэкенд на генерацию кэша для пользователей, если процесс генерации уже идет. Включить его можно через параметр $config[‘lock_backend’] = ‘database’; в файле config.local.php.

$config['lock_backend'] = 'database';

Это поможет избежать больших проблем во время генерации кэша.

7. Как найти и исправить проблемы производительности CS-Cart без навыков программирования

Советы по быстрой оптимизации и поиску проблем с производительностью вашего проекта на CS-Cart и CS-Cart Multi-Vendor без навыков программирования описаны здесь

А так же мы рассказывали в статье о том, что влияет на скорость работы сайта вцелом в этой статье с метриками, на которые можно и нужно обращать внимание.

Ян Кулаков
eCommerce-эксперт CS-Cart

Ян — руководитель отдела контент-маркетинга в CS-Cart с опытом работы более 10 лет в электронной коммерции. Он умеет объяснять сложные вещи простыми словами и разбирается в создании, управлении и развитии маркетплейсов. Ян увлекается обучением людей лучшим практикам, новым технологиям и трендам в eCommerce.