Производительность и запуск
При разработке магазин настроен на удобство: ошибки на экране, шаблоны пересобираются при каждом изменении, кеш выключен. Для покупателей нужно обратное — скорость и закрытые подробности. Почти всё переключается на одной странице панели: «Расширенные параметры → Производительность».
Настройки производительности
| Настройка | При разработке | На рабочем сервере |
|---|---|---|
| Режим отладки | Включён | Выключен |
| Компиляция шаблонов | «Перекомпилировать при изменении файлов» | «Никогда не перекомпилировать» |
| Кеш Smarty | Выключен | Включён |
| Умный кеш для CSS | Выключен | Включён |
| Умный кеш для JavaScript | Выключен | Включён |
| Кеш данных | Выключен | Memcached или другой, если есть на сервере |
«Умный кеш» объединяет все файлы стилей в один и все скрипты в один — именно поэтому модуль регистрирует файлы через registerStylesheet(), а не пишет теги сам.
Режим отладки в файле
Переключатель в панели меняет константу в файле config/defines.inc.php. На рабочем сервере она должна выглядеть так:
// config/defines.inc.php
define('_PS_MODE_DEV_', false);При false ошибки не показываются посетителям, а Symfony работает в окружении prod с кешем в var/cache/prod.
Очистка кеша
После выкладки нового кода кеш очищают:
php bin/console cache:clear --env=prodКоманда удаляет кеш Symfony: контейнер служб, маршруты, шаблоны Twig. Кнопка «Очистить кеш» на странице «Производительность» делает то же и дополнительно сбрасывает собранные шаблоны Smarty и объединённые стили и скрипты.
| Что изменили | Что очистить |
|---|---|
services.yml, routes.yml, шаблон Twig | cache:clear |
| Шаблон Smarty, CSS, JavaScript | Кнопка «Очистить кеш» |
| Переопределение класса | Файл var/cache/prod/class_index.php |
Что замедляет модуль
| Причина | Что делать |
|---|---|
| Запрос к базе в хуке на каждой странице | Кешировать результат, выбирать только нужные колонки |
| Стили и скрипты на всех страницах | Подключать только там, где есть блок модуля |
| Запрос к внешнему сервису при показе страницы | Вынести в команду по расписанию |
Создание объекта в цикле: new Product($id) | Один запрос DbQuery на весь список |
Кеш шаблона в хуке
Блок, который редко меняется, можно собирать один раз. Методу fetch() передают идентификатор кеша, а данные готовят, только если кеша ещё нет:
// modules/acmehello/acmehello.php
public function hookDisplayHome(array $params): string
{
$template = 'module:acmehello/views/templates/hook/home.tpl';
$cacheId = $this->getCacheId('acmehello_home');
if (!$this->isCached($template, $cacheId)) {
$this->context->smarty->assign([
'greeting' => Configuration::get('ACMEHELLO_GREETING'),
]);
}
return $this->fetch($template, $cacheId);
}При включённом кеше Smarty блок приветствия собирается один раз и дальше отдаётся готовым. Когда настройку меняют на странице модуля, кеш сбрасывают вызовом $this->_clearCache($template) после сохранения.
Перед запуском
| Что проверить | Зачем |
|---|---|
Папка install удалена | Иначе магазин можно переустановить |
| Папка панели имеет случайное имя | Адрес /admin перебирают боты |
_PS_MODE_DEV_ равно false | Ошибки и пути не видны посетителям |
| HTTPS включён на всех страницах | «Параметры магазина → Общие» |
| Дружественные адреса включены | «Параметры магазина → Трафик и SEO» |
| Почта отправляется | Тестовое письмо на странице «E-mail» |
| Тестовые заказы и покупатели удалены | Чистая статистика |
| Права на запись только там, где нужно | var, img, upload, download, translations |
| Резервная копия базы и файлов по расписанию | Восстановление после сбоя |
| Режим обслуживания выключен | «Параметры магазина → Общие → Обслуживание» |
Перенос на сервер
Файлы копируют на сервер, базу переносят дампом. После переноса правят три вещи: параметры базы в app/config/parameters.php, домен в панели на странице «Трафик и SEO» в блоке «URL магазина» и очищают кеш.
Обновление магазина
Ядро обновляют модулем обновления от PrestaShop — он ставится из панели, — предварительно сделав копию файлов и базы. Сначала обновление проверяют на копии магазина. Свои модули и дочерняя тема при обновлении не затрагиваются — если вы не правили ядро.
Частая ошибка
Код выложили на сервер, а магазин работает по-старому или падает с ошибкой о неизвестной службе. В окружении prod контейнер и маршруты не пересобираются сами. Очистку кеша включают в порядок выкладки: скопировали файлы — выполнили cache:clear --env=prod — проверили главную страницу и панель.