Ни для кого не секрет, что чем быстрее загружается сайт тем удобнее на нем будет пользователям. Если страницы загружаются быстро пользователи не будут уходить из вашего сайта и поисковики будут относиться к сайту лучше. Для многих современных сайтов узким местом становиться движок выполнения динамических скриптов PHP.
Веб-сервер Nginx при правильной настройке может отдавать просто огромное количество страниц мгновенно, чего нельзя сказать про PHP на генерацию страницы может уходить до нескольких секунд. Но PHP тоже можно ускорить с помощью кэширования. В этой статье мы рассмотрим как настраивается кэширование php, каким оно бывает и зачем вообще это нужно. Для примера будем использовать связку php-fpm и Nginx, но информация из статьи подойдет и для других вариантов установки.
Кэширование PHP
Особенность интерпретируемых языков в том, что при каждом запуске скрипта интерпретатор должен скомпилировать программу и проверить ее на ошибки. Но мы можем обойти. Есть два основных вида кэширования:
- Кэширование готовых страниц — страница генерируется php, а потом пользователю отдается готовая страница без обращения к php. Я расскажу как это сделать через fastcgi, но не рекомендую применять такой метод для wordpress или других движков, их лучше кэшировать с помощью специальных плагинов;
- Кэширование байт кода и инструкций — а это уже интересно, кэшируется не вся страница, а только некоторые инструкции, и куски байт кода, которые не изменяются при вызовах скрипта. Перед тем как выполнять скрипт, интерпретатор должен преобразовать его в понятный для него формат, при кэшировании такое преобразование выполняется только первый запуск, а дальше берется версия из кэша;
- Кэширование сессий — по умолчанию php сохраняет сессии пользователей в файлы и мы можем немного ускорить его работу, если будем сохранять сессии в оперативную память.
Дальше рассмотрим более подробно, как настроить каждый вид кэширования для вашего сервера. Начнем с кэширования opcode php.
Кэширования байткода в PHP
Начиная с PHP 5.5 в интерпретатор языка была добавлена поддержка кэширования байткода из ZendFramework. В новых версиях этот кэш позволяет очень сильно увеличить производительность вашего ресурса, например, есть сведения, что на PHP 7 Wordpres и другие движки работают чуть ли не в два раза быстрее. Перед тем как настраивать кєширование opcode php, нужно установить его пакет:
sudo apt install php-opcache
Или для Red Hat дистрибутивов:
sudo yum install php-opcache
Затем, чтобы включить кэширование нужно добавить несколько строк в php.ini, можно также создать отдельный файл в /etc/php/conf.d/
vi /etc/php.d/opcache.ini
Рассмотрим что означают эти строки, чтобы вы знали какие значения установить. Первая строка загружает расширение, здесь ничего менять не нужно.
- opcache.error_log — указывает файл для записи лога ошибок, будет полезно при отладке;
- opcache.log_verbosity_level — указывает насколько подробным должен быть лог файл, значение от 1 до 4;
- opcache.enable — включает кэширование;
- opcache.enable_cli — включает кэширование страниц php для консольной версии;
- opcache.memory_consumption — количество оперативной памяти для хранения кэша;
- opcache.max_accelerated_files — число скриптов/файлов, которые нужно кэшировать;
- opcache.validate_timestamps — проверять время изменения данных в файле скрипта;
- opcache.revalidate_freq — частота проверки для предыдущего параметра;
- opcache.revalidate_path — установите в 0 чтобы выполнять проверку при include только первый раз;
- opcache.enable_file_override — кэширует запросы к атрибутам файлов, например, существование и т д;
- opcache.blacklist_filename — список файлов, которые не нужно кэшировать;
- opcache.max_file_size — максимальный размер файла скрипта для кэширования, 0 — не ограниченно;
- opcache.interned_strings_buffer — допустимое количество строк в буфере;
- opcache.fast_shutdown — использовать быстрый способ освобождения памяти.
После сохранения всех настроек вам останется только перезапустить php или ваш веб-сервер:
systemctl restart php-fpm
Для того чтобы убедиться, что все работает вы можете захотеть посмотреть какие скрипты уже закэшированы. Для этого можно использовать скрипт opcache-status. Просто сохраните скрипт в директорию веб-сервера, а затем дайте ему права:
chmod 777 /var/www/losst.ru/opcode.php
Дальше можно открыть скрипт в браузере для просмотра статистики:
Здесь можно видеть подробную статистику по кєширвоанию, настройки и количество занятой памяти.
Хранение сессий в memcached
По умолчанию php хранит сессии в файловой системе, в некоторых случаях, вы можете достаточно сильно ускорить работу php, если перенесете хранение сессий из файлов в оперативную память, например, memcached. Сначала нужно установить memcached и php библиотеку для работы с ней:
sudo apt install memcached php-memcached
Или для систем на базе Red Hat:
sudo yum install memcached php-memcached
Сначала нам нужно настроить memcached, откройте файл /etc/sysconfig/memcached и найдите строку CACHESIZE, здесь нужно указать объем оперативной памяти, которая выделяется под кэш:
vi /etc/sysconfig/memcached
Дальше осталось указать php использовать memcached для хранения сессий:
vi /etc/php.ini
Осталось перезапустить ваш php интерпретатор:
systemctl restart php-fpm
Если вы хотите проверить все ли правильно кэшируется и есть ли вообще что-либо в кэше, можно использовать phpmemcacheadmin.
Кэширование страниц fastcgi
Я не советую использовать кэширование fastgci для сайтов WordPress, потому что там есть специальные плагины, которые могут точно контролировать кэш, очищать его когда нужно и вовремя обновлять. Но во всех остальных случаях кэш fastcgi может очень сильно ускорить работу сайта. Настраивается он в конфиге, где вы включаете fastgci, например, в конфигурации веб-сервера Nginx. Минимально для настройки кэша fastgci достаточно добавить в блок server такие строки:
vi /etc/nginx/vhosts/site.conf
Первая строка настраивает сразу несколько параметров, во первых, она добавляет путь к кэшу, можно использовать любой, только чтобы папка существовала и у веб-сервера были права для записи в нее. Директива levels указывает сколько подпапок будет. Следующая строка указывает что будет использоваться в качестве ключа для кэша. Ключ будет хэширован в md5.
Теперь нужно настроить блок обработки php:
Здесь мы обращаемся к уже настроенной зоне памяти MYAPP, а также указываем время жизни кэша в один час. Для проверки кэширования можно посмотреть содержимое папки:
ls -lR /var/nginx/cache/
С помощью таких методов ваши страницы будут загружаться намного быстрее. Если вам понадобится отключить кєширование php для отдельных страниц, то сначала создаем переменную no_cache со значением 0:
Затем проверяем нужные параметры, и если соответствует, то устанавливаем значение в 1:
И на завершение передаем значение этой переменной таким директивам, это отключит кэширование когда не нужно:
Не забудьте перезапустить Nginx перед тем как проверять:
systemctl restart nginx