Роман Ананьев 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.
Отдельно хочется обратить внимание на то, что не все модули и версии 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, как показано на скриншоте:
'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, как показано на скриншоте:
'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 без навыков программирования описаны здесь.
А так же мы рассказывали в статье о том, что влияет на скорость работы сайта вцелом в этой статье с метриками, на которые можно и нужно обращать внимание.
Ян Кулаков
Ян — руководитель отдела контент-маркетинга в CS-Cart с опытом работы более 10 лет в электронной коммерции. Он умеет объяснять сложные вещи простыми словами и разбирается в создании, управлении и развитии маркетплейсов. Ян увлекается обучением людей лучшим практикам, новым технологиям и трендам в eCommerce.