Общие настройки 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_STRICTPhp настройки для сайта (настройки 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)