Администрирование PHP: настройка php.ini и оптимизация производительности
Файл php.ini является основным конфигурационным элементом интерпретатора PHP. Его настройка определяет поведение скриптов: лимиты памяти, время выполнения, обработку ошибок, загрузку расширений и другие параметры. Правильная конфигурация необходима для обеспечения стабильной и безопасной работы веб-приложений.
Основы настройки php.ini на сервере
Как найти и изменить основной php.ini?
Базовое решение предполагает редактирование главного конфигурационного файла, который используется всеми режимами PHP (CLI, Apache module, FPM).
- Определить расположение файла. Команда
php --iniв терминале покажет путь до загруженного php.ini. - Создать резервную копию:
cp /etc/php/8.2/cli/php.ini /etc/php/8.2/cli/php.ini.bak. - Отредактировать файл в текстовом редакторе (например,
sudo nano /etc/php/8.2/apache2/php.ini). - После внесения изменений перезапустить веб-сервер или PHP-FPM:
sudo systemctl restart apache2(илиsudo service php8.2-fpm restart).
Проблема: Изменения не вступают в силу.
- Проверить, какой именно php.ini загружается: создать простой скрипт с
<?php phpinfo(); ?>и найти строку Loaded Configuration File. - Убедиться, что перезапуск сервера выполнен от имени root или через sudo.
Как изменить параметры PHP без доступа к основному php.ini?
Если непосредственное редактирование php.ini невозможно (например, на хостинге), можно использовать файлы .user.ini или .htaccess.
.user.ini - автоматически применяется для директории, в которой он расположен (требуется PHP в режиме CGI/FastCGI).
; Пример .user.ini
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64MPhp ниже рекомендуемого значения 512mb (увеличение лимита памяти php)
.htaccess (для Apache):
php_value memory_limit 256M
php_flag display_errors onнайти php ini (поиск файла php.ini)
Ошибка: Директива не поддерживается в .htaccess.
Только ограниченный набор директив можно менять через php_value (например, memory_limit, upload_max_filesize). Некоторые параметры (например, max_execution_time) требуют php_admin_value, доступного только в конфигурации виртуального хоста.
Как настроить php.ini для конкретного пула PHP-FPM?
Для разных сайтов на одном сервере можно задать индивидуальные параметры через конфигурацию пула PHP-FPM.
- Открыть файл пула, например
/etc/php/8.2/fpm/pool.d/www.conf. - Добавить или изменить строки вида:
php_admin_value[memory_limit] = 512M
php_admin_flag[display_errors] = offPhp ini сервера (настройка php.ini на сервере)
После изменений перезагрузить PHP-FPM: sudo service php8.2-fpm reload.
Конфликт: Значения из пула переопределяются глобальными.
Директивы с префиксом php_admin_value имеют наивысший приоритет. Однако если в основном php.ini установлено значение с помощью PHP_INI_SYSTEM, его не изменить через пул. Проверить уровень доступа можно в документации PHP.
Как изменить настройки PHP во время выполнения скрипта?
Функция ini_set() позволяет менять параметры для текущего скрипта (для директив с режимом PHP_INI_ALL или PHP_INI_USER).
<?php
ini_set('memory_limit', '256M');
ini_set('max_execution_time', 120);
echo ini_get('memory_limit');
?>
Это удобно для временного увеличения лимитов в конкретных операциях (например, загрузка большого файла).
Ограничение: Изменения действуют только до конца выполнения скрипта и не влияют на другие запросы.
Расширенные примеры настройки php.ini
Ниже приведены подробные примеры изменения ключевых директив с пояснением каждого шага и указанием ожидаемого результата.
Пример 1: Увеличение лимита памяти скрипта
Задача: разрешить скрипту использовать до 512 МБ оперативной памяти.
Код в php.ini:
memory_limit = 512M
Результат: После перезапуска веб-сервера значение memory_limit станет 512M.
[PHP] memory_limit = 512M
Пояснение: Единицы измерения: K (килобайты), M (мегабайты), G (гигабайты). Если указать только число без суффикса, интерпретируется как байты. Значение -1 означает отсутствие лимита.
Пример 2: Настройка обработки ошибок при разработке
Для отладки полезно включить показ всех ошибок.
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
Результат: Все ошибки, включая уведомления и предупреждения, будут выводиться на экран.
[PHP] error_reporting = E_ALL display_errors = On (после перезапуска скрипт с ошибкой выведет её текст)
Проблема: На боевом сервере отображение ошибок недопустимо. Следует использовать log_errors = On и указать путь к логу.
log_errors = On
error_log = /var/log/php_errors.log
Пример 3: Ограничение времени выполнения скрипта
По умолчанию PHP-скрипт может выполняться не более 30 секунд. Для длительных задач (обработка видео, генерация отчётов) лимит нужно увеличить.
max_execution_time = 300
max_input_time = 120
Результат: Скрипт сможет работать до 5 минут, а парсинг входных данных - до 2 минут.
После изменения скрипт с циклом sleep(250) завершится успешно.
Примечание: max_input_time влияет только на время, затрачиваемое на парсинг запроса (POST/GET).
Пример 4: Настройка загрузки файлов
Для сайта, позволяющего загружать изображения до 10 МБ и архив до 50 МБ.
file_uploads = On
upload_max_filesize = 50M
post_max_size = 60M
max_file_uploads = 20
Результат: Разрешена загрузка одного файла до 50 МБ, общий размер POST-данных - до 60 МБ, максимум 20 файлов за раз.
При попытке загрузить файл 55 МБ возникнет ошибка “The uploaded file exceeds the upload_max_filesize”
Ошибка: post_max_size должен быть больше или равен upload_max_filesize, иначе загрузка больших файлов невозможна.
Пример 5: Включение и настройка OPcache
OPcache ускоряет выполнение PHP, кэшируя скомпилированный код.
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 0 ; только для продакшена, отключает проверку изменений
Результат: Кэширование включено, выделено 256 МБ памяти, до 10000 файлов могут быть кэшированы. На продакшене, чтобы изменения вступали в силу, нужно очищать кэш вручную (через функцию opcache_reset() или перезапуск сервера).
В phpinfo() появится секция OPcache с активными настройками.
Проблема: Если validate_timestamps = 1 (значение по умолчанию) и revalidate_freq установлено неверно, возможны проблемы с устаревшим кэшем.
Пример 6: Настройка сессий
Изменить место хранения сессий и время жизни.
session.save_handler = files
session.save_path = "/var/lib/php/sessions"
session.gc_maxlifetime = 1440
session.cookie_lifetime = 0 ; до закрытия браузера
Результат: Сессии хранятся в файлах в указанной папке. Время жизни данных сессии 24 минуты (1440 секунд). Cookie сессии действует до закрытия браузера.
После изменения скрипт session_start(); $_SESSION['test'] = time(); сохранит значение в файл.
Безопасность: Для серверов с высокой нагрузкой рекомендуется использовать session.save_handler = redis или memcached для повышения производительности.