Конфигурация PHP: обязательные директивы

Раздел: Конфигурация PHP -> Общие настройки 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 = 120

Php настройки для сайта (настройки 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_STRICT

open_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=512M

opcache.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 секундами, консольные скрипты могут выполняться без ограничения (блокировка опасна для долгих задач).

Необходимые настройки PHP - comments

En
необходимо в настройках php указать (php)