Сайт Drupal, постоянно занимающий около 5 секунд для создания страницы, почти всегда ждет одного из них:
- База данных
- PHP выполнение
- Внешние HTTP запросы
- Кэш отключен / неправильно настроен
- Медленный пользовательский код
Во-первых, давайте определим, транспортный ли это слой или бэкэнд. С сервера:
curl -o /dev/null -s -w \
'connect: %{time_connect}\nstarttransfer: %{time_starttransfer}\ntotal: %{time_total}\n' \
https://example.com
Если time_starttransfer Это около 5 секунд, бэкэнд медленный.
Действительно ли кэш Drupal работает?
drush statusПроверьте:
- кэш Рендера
- Динамический кэш страницы
- Кэш страницы
Затем проверьте:
drush cget system.performanceЕсли вы вошли в систему, кэш страницы не поможет, но должен отображать и динамический кэш страницы.
Включить запись базы данных
Если MySQL/MariaDB:
SHOW FULL PROCESSLIST;При загрузке страницы.
Или включить медленный журнал запросов:
SET GLOBAL slow_query_log=1;
SET GLOBAL long_query_time=0.2;Затем проверьте:
/var/lib/mysql/*-slow.logОдин запрос, который занимает несколько секунд, является общим.
Профиль Drupal
Установите модули Devel и Profiler:
composer require drupal/webprofilerWebProfiler покажет
- маршрутизация
- ветка
- SQL
- услуги
- крючки
- время
Обычно вы сразу видите виновника.
Проверьте HTTP-запросы
Один забытый звонок может стоить 5 секунд.
Поиск:
grep -R "http" web/modules/custom
grep -R "curl" web/modules/custom
grep -R "Guzzle" web/modules/custom
grep -R "file_get_contents(" web/modules/custom
Все, что связывается с другим сервером во время генерации страницы, подозрительно.
Проверьте backend кэш
При использовании кэша базы данных:
drush ev "print_r(\Drupal::service('cache.default'));"Redis значительно быстрее на загруженных сайтах.
Не забудьте отключить Twig debug
Настройки разработки легко добавляют секунды. Проверьте:
development.services.ymlИщите
twig.config:
debug: true
auto_reload: true
cache: falseПроизводство должно быть
debug: false
auto_reload: false
cache: trueOPcache
Проверьте:
php -i | grep opcache.enable
php -i | grep opcache.validate_timestampsПроизводство обычно использует
opcache.enable=1
opcache.validate_timestamps=0Xbug
Проверьте:
php -m | grep xdebugили
php -i | grep xdebug.modeЕсли включено, отключите его.
Измерение SQL
Включить запись запросов:
$settings['container_yamls'][] = DRUPAL_ROOT . '/sites/development.services.yml';Используйте WebProfiler.
Обычная кэшированная страница часто:
- 20–80 SQL-запросов
Несколько сотен запросов указывают на проблему.
Идентификация дорогих крючков
Поиск пользовательских модулей для
hook_page_attachments()
hook_preprocess_page()
hook_preprocess_node()
hook_entity_view()
hook_views_pre_render()
hook_views_query_alter()Они часто приводят к задержкам.
Проверить просмотры
Большой просмотр может занять целых 5 секунд.
Включите предварительный просмотр SQL в View и запустите:
EXPLAINИщите
- Использование временного
- Использование FileSort
- Полное сканирование стола
Измерить PHP
Установите XHProf, Tideways или Blackfire.
График пламени сразу определяет, где проводится время исполнения.
Проверьте бревна
drush watchdog:showили
tail -f web/sites/default/files/php.logПовторные предупреждения могут значительно замедлить генерацию страниц.
Марка без Drupal
Создайте простой файл PHP:
<?php
echo "hello";Сравните:
time curl https://example.com/test.php
time curl https://example.com/Если test.php Drupal работает быстро, а Drupal медленно, проблема в Drupal, а не в PHP, веб-сервере или TLS.