Администрирование PHP: настройка php.ini и оптимизация производительности

Раздел: Администрирование -> Конфигурация PHP

Файл php.ini является основным конфигурационным элементом интерпретатора PHP. Его настройка определяет поведение скриптов: лимиты памяти, время выполнения, обработку ошибок, загрузку расширений и другие параметры. Правильная конфигурация необходима для обеспечения стабильной и безопасной работы веб-приложений.

Основы настройки php.ini на сервере

Как найти и изменить основной php.ini?

Базовое решение предполагает редактирование главного конфигурационного файла, который используется всеми режимами PHP (CLI, Apache module, FPM).

  1. Определить расположение файла. Команда php --ini в терминале покажет путь до загруженного php.ini.
  2. Создать резервную копию: cp /etc/php/8.2/cli/php.ini /etc/php/8.2/cli/php.ini.bak.
  3. Отредактировать файл в текстовом редакторе (например, sudo nano /etc/php/8.2/apache2/php.ini).
  4. После внесения изменений перезапустить веб-сервер или 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 = 64M

Php ниже рекомендуемого значения 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.

  1. Открыть файл пула, например /etc/php/8.2/fpm/pool.d/www.conf.
  2. Добавить или изменить строки вида:
php_admin_value[memory_limit] = 512M
php_admin_flag[display_errors] = off

Php 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');
?>

Это удобно для временного увеличения лимитов в конкретных операциях (например, загрузка большого файла).

Ограничение: Изменения действуют только до конца выполнения скрипта и не влияют на другие запросы.

- настройка settings php (настройка файла settings.php)
- Php max upload (максимальный размер загрузки в php)
- Php режим (режимы работы php)

Расширенные примеры настройки 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 для повышения производительности.

Настройка php.ini на сервере - comments

En
Php ini сервера (php)