Почему изменения в PHP-скриптах отображаются с большой задержкой

Мне неоднократно задавали вопрос — почему на некоторых хостингах при сохранении PHP-файлов по FTP/SFTP изменения видны не сразу, а часто с опозданием в несколько минут. Рассказываю, откуда берется этот эффект и как от него избавиться.

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

Кеширование Вордпресс

Например, в популярном плагине WP Super Cache кеширование для известных пользователей отключается одной галочкой.

В плагине WP Super Cache кеширование для авторизованных пользователей отключается одной галочкой

Чтобы полностью исключить влияние плагинов кеширования, на время отладки их можно вообще деактивировать.

Браузерное кеширование

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

Обновить страницу с принудительной перезагрузкой всех данных можно с помощью комбинации Cmd+Shift+R на Маках и Ctrl+Shift+R под Виндоус. Можно воспользоваться режимом «Частный доступ» в Сафари или режимом «Инкогнито» в Хроме. Оба режима вызываются одной комбинацией Cmd+Shift+N.

Режим Инкогнито в Гугл Хроме

Серверное кеширование OPCache

Если вы точно уверены, что проблемы создает не кеш браузера и не кеш Вордпресс, похоже, что у вас включено серверное кеширование.

Его внезапное появление часто связано с повышением версии PHP. Например, у вас на хостинге был включен PHP 5.3, а после перехода на PHP 7 изменения в PHP-скриптах вдруг стали появляться с большим опозданием. Если так, скорее всего ваш PHP работает с активным механизмом кеширования байт-кода, который называется OPCache.

Для справки

PHP-код перед выполнением компилируется в байт-код. В старых версиях PHP компиляция выполнялась каждый раз при выполнении скрипта, в новых OPCache хранит байт-код в памяти и выполняет его при повторном запросе. Это дает большой прирост в скорости, снижении нагрузки и т.д.

Естественно, заниматься отладкой кода с активным OPCache очень некомфортно. Поэтому, если отладка происходит на боевом сайте, кеширование на время работ лучше отключить. Делается это очень просто, добавлением одной строчки в php.ini.

Как отключить

В качестве примера, покажу как отключается OPCache в панели ISP виртуального хостинга Рег.ру.

Подключаемся к серверу по FTP или открываем файловый менеджер в панели управления хостингом, идем в директорию php-bin, выбираем файл php.ini и нажимаем «Изменить».

Подключаемся к серверу по FTP или открываем файловый менеджер в панели управления хостингом и идем в директорию php-bin.

Для PHP версий 5.5, 5.6, 7.0, 7.1 добавляем такую строку.

opcache.enable = Off

В старых версиях PHP 5.3 и 5.4 чаще всего используется XCache, он отключается такой строчкой.

xcache.cacher = Off

Чтобы изменения вступили в силу, нужно перезагрузить сервер.

Ручная перезагрузка доступна не везде, поэтому перезагрузить принудительно сервер можно, сменив версию PHP на более старую, а потом снова вернуть рабочую.

Сменить версию PHP

После отладки не забудьте снова включить OPCache и перезагрузить сервер.

Все таки OPCache существенно экономит ресурсы, и будет не совсем разумно от него отказываться.

И напомню, проверить версию PHP и узнать обо всех установленных расширениях можно с помощью функции phpinfo();

И ещё

Можно попробовать добавить в корневой .htaccess такую инструкцию:

php_flag opcache.enable Off

Но работает это не везде.

Иван Данилин
Автор Иван Данилин

Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.

Подробнее
Добавить комментарий