Общие настройки PHP в конфигурации веб-сайта

Раздел: Конфигурация PHP -> Общие настройки PHP

Общие принципы конфигурации PHP для сайта

Основной рекомендуемый подход для production-окружения состоит в комбинации безопасности, производительности и стабильности. В файле php.ini следует задать такие параметры:

; Отключение отображения ошибок на экране
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
; Логирование ошибок
log_errors = On
error_log = /var/log/php_errors.log

; Лимиты выполнения
max_execution_time = 60
max_input_time = 60
memory_limit = 256M

; Загрузка файлов
upload_max_filesize = 64M
post_max_size = 68M
max_file_uploads = 20

; Временная зона
date.timezone = "Europe/Moscow"

; Сессии
session.save_handler = files
session.save_path = "/tmp/php_sessions"
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440

; OPcache
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 2

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

Эти настройки обеспечивают минимальное потребление памяти, контроль времени выполнения и безопасное скрытие деталей ошибок от пользователей.

Как настроить отображение ошибок для разработки и продакшена?

Для разработки рекомендуется показывать все ошибки, для продакшена - скрывать и логировать.

; Разработка (dev-окружение)
display_errors = On
display_startup_errors = On
error_reporting = E_ALL

; Продакшен (prod-окружение)
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

Php настройки для сайта (настройки php для сайта)

Ошибка: при display_errors = On в продакшене на экран выводятся пути к файлам и SQL-запросы, что угрожает безопасности. Решение: в файле .htaccess или виртуальном хосте переопределить значение только для конкретного поддомена или через директиву php_value.

Как увеличить лимит памяти для выполнения скриптов?

Установка memory_limit зависит от задач: 128M для типичных проектов, 256M для CMS с плагинами, 512M для обработки изображений или генерации PDF.

memory_limit = 256M ; значение можно изменить на лету через ini_set('memory_limit', '512M');

Проблема: превышение лимита вызывает фатальную ошибку Allowed memory size of X bytes exhausted. Решение: увеличить лимит, проверить циклические ссылки в коде, использовать утечки памяти.

Как правильно установить временную зону?

Параметр date.timezone обязателен для корректной работы функций даты/времени. Значение выбирается по местоположению сервера или аудитории.

date.timezone = "Europe/Moscow"
; Альтернативы: "UTC", "Asia/Yekaterinburg", "America/New_York"

Ошибка: отсутствие настройки вызывает предупреждение It is not safe to rely on the system's timezone settings. Решение: установить значение в php.ini или через date_default_timezone_set() в начале скрипта.

Как настроить загрузку файлов?

Настройки upload_max_filesize, post_max_size и max_file_uploads контролируют размер и количество загружаемых файлов. Значение post_max_size должно быть больше upload_max_filesize.

upload_max_filesize = 100M
post_max_size = 108M
max_file_uploads = 10

Проблема: при превышении upload_max_filesize или post_max_size файл не загружается, в $_FILES приходит ошибка UPLOAD_ERR_INI_SIZE. Решение: увеличить лимиты, проверить настройки сервера (nginx client_max_body_size).

Как оптимизировать сессии?

Для высоконагруженных проектов файловое хранение (files) может создать узкое место. Альтернативы: redis, memcached или database (pdo).

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
; Настройка сборки мусора
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 7200 ; 2 часа

Проблема: блокировка сессий при множественных ajax-запросах. Решение: использовать session_write_close() после завершения записи данных или перейти на Redis/Memcached с асинхронным чтением.

Как использовать OPcache?

OPcache ускоряет выполнение PHP-скриптов за счет кэширования скомпилированного кода. Для проекта с частыми изменениями нужно настроить проверку актуальности.

opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 0 ; отключение проверки (только для продакшена, если файлы не меняются)
; или
opcache.revalidate_freq = 5 ; проверять каждые 5 секунд

Проблема: если opcache.revalidate_freq установлен в 0, изменения в файлах не применяются до перезапуска сервера или ручной очистки кэша. Решение: использовать opcache_reset() в скрипте развертывания или установить положительное значение (2–5 секунд).

Расширенные примеры конфигурации

Ниже приведены подробные примеры настройки PHP в различных сценариях с демонстрацией кода и ожидаемого результата.

Пример 1: Файл php.ini для разработки (максимальное отображение ошибок, увеличенные лимиты)

Пример
; php.ini - dev
[PHP]
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
; Логирование в отдельный файл
error_log = /path/to/dev_errors.log
; Большой лимит памяти для отладки
memory_limit = 512M
max_execution_time = 300
max_input_time = 300
; Отключение кэша для быстрой смены кода
opcache.enable = 0
; Временная зона
date.timezone = "Europe/Moscow"
; Настройки загрузки (для тестирования)
upload_max_filesize = 500M
post_max_size = 550M
max_file_uploads = 50
; Сессии - файловое хранение с быстрым сбором мусора
session.save_handler = files
session.save_path = "/tmp/php_sessions_dev"
session.gc_probability = 50
session.gc_divisor = 100
session.gc_maxlifetime = 3600

Результат: в скрипте phpinfo(); отобразятся все ошибки, доступно до 512 МБ памяти, файлы до 500 МБ загружаются без ограничений.

(пример вывода phpinfo)
memory_limit => 512M
upload_max_filesize => 500M
opcache.enable => Off

Пример 2: Файл php.ini для продакшена (минимальное раскрытие информации, OPcache)

Пример
; php.ini - production
[PHP]
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
; Лимиты для стабильности
memory_limit = 128M
max_execution_time = 30
max_input_time = 30
; OPcache включён
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 2
; Безопасность загрузки
uploud_max_filesize = 20M
post_max_size = 25M
max_file_uploads = 10
; Сессии на Redis (если установлен)
session.save_handler = redis
session.save_path = "tcp://localhost:6379?auth=password&database=0"
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440

Результат: ошибки не выводятся на экран, время выполнения ограничено 30 секундами, файлы до 20 МБ обрабатываются, кэш OPcache ускоряет выполнение.

(вывод phpinfo)
display_errors => Off
memory_limit => 128M
opcache.enable => On
session.save_handler => redis

Пример 3: Настройка через .htaccess (модуль mod_php)

Пример
# .htaccess в корне проекта
php_value error_reporting 22527 ; E_ALL & ~E_DEPRECATED
php_flag display_errors off
php_value memory_limit 256M
php_value upload_max_filesize 100M
php_value post_max_size 105M
php_value max_execution_time 90

Результат: эти директивы применяются только к данному каталогу и его подкаталогам без изменения глобального php.ini.

(с помощью phpinfo() в этом каталоге видно, что display_errors = Off, memory_limit = 256M)

Пример 4: Использование .user.ini для CGI/FastCGI

Пример
; .user.ini (помещается в тот же каталог, что и скрипт)
error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /tmp/user_errors.log
memory_limit = 128M
; Директива действует только на запросы в этом каталоге

Результат: настройки применяются к вызываемым PHP-скриптам из данного каталога. Нельзя использовать php_flag в .user.ini.

(проверка через ini_get('memory_limit') возвращает 128M)

Пример 5: Динамическое изменение настроек через ini_set()

Пример
<?
// Увеличиваем лимит памяти для конкретного скрипта
$current = ini_get('memory_limit');
echo "Текущий лимит: $current
"; ini_set('memory_limit', '1024M'); echo "Новый лимит: " . ini_get('memory_limit') . "
"; // Попробуем изменить display_errors (требуется PHP_INI_ALL для некоторых директив) if (ini_get('display_errors') === '1') { echo "Ошибки отображаются"; } else { echo "Ошибки скрыты"; } ?>

Результат выполнения (если display_errors разрешено изменять):

Текущий лимит: 128M
Новый лимит: 1024M
Ошибки скрыты

Обратите внимание: не все параметры можно изменить через ini_set (зависит от режима: PHP_INI_USER, PHP_INI_PERDIR и т.д.).

Пример 6: Настройка сессий на Redis через ini_set()

Пример
<?
// Изменение обработчика сессий на лету (если модуль redis загружен)
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379');
session_start();
$_SESSION['user'] = 'admin';
echo "Сессия стартовала, ID: " . session_id();
?>

Результат: сессия сохраняется в Redis, значение ID и данные доступны между запросами.

(вывод после первого запроса)
Сессия стартовала, ID: abc123def456

Пример 7: Мониторинг OPcache с помощью встроенной функции

Пример
<?
// Получение статистики OPcache
if (function_exists('opcache_get_status')) {
    $status = opcache_get_status(false);
    echo "Кэшировано файлов: " . $status['opcache_statistics']['num_cached_scripts'] . "
"; echo "Использовано памяти: " . round($status['memory_usage']['used_memory'] / 1024 / 1024, 2) . " МБ
"; echo "Промахов: " . $status['opcache_statistics']['misses'] . "
"; } else { echo "OPcache не активен или не установлен"; } ?>

Результат (примерный вывод):

Кэшировано файлов: 1200
Использовано памяти: 45.23 МБ
Промахов: 340

Этот скрипт помогает оценить эффективность OPcache и необходимость увеличения opcache.memory_consumption.

Пример 8: Проверка всех активных настроек с помощью get_loaded_extensions и ini_get_all

Пример
<?
// Список загруженных расширений
$extensions = get_loaded_extensions();
echo "Расширения: " . implode(', ', $extensions) . "

"; // Все настройки PHP (только для текущего контекста) $all_settings = ini_get_all(); // Вывести только ключевые: memory_limit, max_execution_time, upload_max_filesize, display_errors $keys = ['memory_limit', 'max_execution_time', 'upload_max_filesize', 'display_errors']; foreach ($keys as $key) { if (isset($all_settings[$key])) { echo "$key: " . $all_settings[$key]['local_value'] . " (global: " . $all_settings[$key]['global_value'] . ")
"; } } ?>

Пример результата:

Расширения: Core, PDO, mysql, redis, opcache, json, session, ...

memory_limit: 256M (global: 256M)
max_execution_time: 60 (global: 60)
upload_max_filesize: 64M (global: 64M)
display_errors: Off (global: Off)

Настройки PHP для сайта - comments

En
Php настройки для сайта (php)