Конфигурация PHP: обязательные директивы
Общие настройки PHP: оптимальный набор директив
Как сконфигурировать PHP для обеспечения производительности и безопасности на типовом проекте?
Наиболее сбалансированное решение включает несколько ключевых параметров, которые переопределяют поведение интерпретатора. Рекомендуется применять их в php.ini или в пользовательских файлах (.user.ini, .htaccess).
; Основные настройки php.ini
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
date.timezone = Europe/Moscow
memory_limit = 128M
max_execution_time = 30
max_input_time = 60
post_max_size = 20M
upload_max_filesize = 20M
allow_url_fopen = Off
expose_php = Off
session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1необходимо в настройках php указать (необходимые настройки php)
Каждая директива решает конкретную задачу: display_errors = Off скрывает ошибки от пользователей (критично для продакшена), log_errors сохраняет их в лог. memory_limit = 128M ограничивает потребление памяти скриптом. allow_url_fopen = Off предотвращает атаки на включение удалённых файлов. expose_php скрывает версию PHP в HTTP-заголовках. Настройки сессии обеспечивают защиту от перехвата cookie.
Типичные ошибки при применении
Если display_errors = On оставить на продакшене, злоумышленники получат информацию о структуре сайта. memory_limit слишком мал (например, 32M) вызывает ошибки Fatal Error: Allowed memory size exhausted. Решение - увеличить memory_limit до 256M для тяжелых скриптов. Ошибка POST Content-Length exceeds limit появляется при post_max_size меньше размера отправляемых данных.
Как настроить PHP для локальной разработки с выводом ошибок?
Для разработки удобно видеть все предупреждения. Используйте файл .user.ini в корне проекта.
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
date.timezone = Europe/Moscow
memory_limit = 256M
max_execution_time = 120Php настройки для сайта (настройки php для сайта)
display_startup_errors покажет ошибки, возникающие при запуске PHP. error_reporting = E_ALL включает все уровни, включая уведомления. Цель - быстрое обнаружение проблем. max_execution_time увеличен до 120 секунд для отладки долгих скриптов.
Возможные проблемы
На продакшене забывают переключить display_errors = Off. Рекомендуется хранить разные .user.ini для разных окружений через систему управления конфигурацией (Ansible, Docker).
Какие настройки PHP критичны для shared-хостинга?
На shared-хостинге доступ к файловой системе ограничен. Необходимо защитить другие сайты.
open_basedir = /home/user/www:/tmp
disable_functions = exec,passthru,shell_exec,system,popen
allow_url_fopen = Off
display_errors = Off
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICTopen_basedir ограничивает доступ к файлам только указанными директориями. disable_functions блокирует выполнение системных команд. Цель - минимизировать ущерб при компрометации одного из сайтов.
Ошибка при вызове запрещённой функции
При попытке использовать exec() PHP выбросит Warning: exec() has been disabled for security reasons. Решение - отказаться от таких функций или запросить у хостинг-провайдера включение при необходимости.
Как оптимизировать PHP для высоконагруженных проектов?
Для производительности используют OPcache и opcache.preload, а также увеличивают буферы.
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
opcache.preload=/var/www/html/preload.php
max_execution_time=120
max_input_time=120
memory_limit=512Mopcache.validate_timestamps=0 отключает проверку изменений файлов - кэш обновляется только при очистке. opcache.preload загружает классы в память до первого запроса. Цель - максимальная скорость выполнения.
Проблема с устаревшим кэшем
При изменении файлов без инвалидации кэша остаётся старый код. Решение: либо установить opcache.validate_timestamps=1 с opcache.revalidate_freq=2, либо вручную очищать через opcache_reset() после деплоя.
Расширенные примеры настройки PHP
Дополнительные нестандартные конфигурации для специфических задач.
Динамическое изменение open_basedir через .user.ini
Для мультисайтовой установки можно задать open_basedir для каждого домена отдельно.
; В корне каждого сайта файл .user.ini
open_basedir = /var/www/site1:/tmp:/var/www/sharedРезультат: скрипт может читать только свои файлы и общую директорию shared. Если скрипт попытается открыть файл из другого сайта, PHP выдаст ошибку.
Warning: file_get_contents(/var/www/site2/secret.txt): Failed to open stream: Operation not permitted
Настройка пула PHP-FPM для разных приложений
В php-fpm можно создавать несколько пулов с разными параметрами.
[my_app]
user = myuser
group = myuser
listen = /run/php/php8.2-fpm-myapp.sock
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
php_value[memory_limit] = 128M
php_value[max_execution_time] = 60
php_value[upload_max_filesize] = 10MРезультат: приложение работает в изолированном пуле со своими лимитами. Параметр pm = dynamic автоматически регулирует количество процессов под нагрузку.
Блокировка нежелательных суперглобальных переменных через авто-препенд файл
Можно переопределить auto_prepend_file для удаления опасных массивов.
; php.ini
auto_prepend_file = /etc/php/cleanup.php// cleanup.php
unset($_GET['action'], $_POST['cmd']);
unset($_SERVER['HTTP_X_FORWARDED_FOR']); // фиксация доверияРезультат: при каждом запросе удаляются указанные переменные, что усложняет эксплуатацию некоторых уязвимостей.
Кастомная обработка ошибок через пользовательский обработчик
С помощью set_error_handler() можно логировать ошибки в базу данных.
// Включается в php.ini
display_errors = Off
error_reporting = E_ALL | E_STRICT
// В коде проекта
set_error_handler(function($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) return false;
$log = sprintf("[%s] %s in %s:%d\n", date('c'), $message, $file, $line);
file_put_contents('/var/log/php_errors.log', $log, FILE_APPEND);
// Можно также записать в БД
return true;
});Результат: ошибка не отображается пользователю, но сохраняется в лог-файл.
Ограничение времени выполнения для CLI-скриптов отдельно от веб
В php.ini можно задать разные значения через раздел [CLI].
[PHP]
max_execution_time = 30
[CLI]
max_execution_time = 0Результат: веб-скрипты ограничены 30 секундами, консольные скрипты могут выполняться без ограничения (блокировка опасна для долгих задач).