Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код: Skills Начать
Рубрики
Linux Администрация

Настройка файла php.ini: Полное руководство по оптимизации PHP на вашем сервере

Файл php.ini — это главный файл конфигурации PHP — основа почти каждого современного веб-приложения. Независимо от того, используете ли вы WordPress, Laravel, Magento или пользовательское приложение, правильная настройка php.ini может значительно улучшить производительность вашего сервера, повысить безопасность и обеспечить полную совместимость с вашим стеком программного обеспечения.

Это подробное руководство проведет вас через все, что вам нужно знать: что делает php.ini, как его найти, как безопасно его редактировать и как проверить, что ваши изменения работают правильно.

1. Что такое php.ini и почему это важно?

Файл php.ini — это простой текстовый файл конфигурации, который PHP читает при каждой инициализации. Он содержит сотни директив — пар ключ-значение, которые контролируют практически все аспекты поведения PHP во время выполнения, включая:

  • Выделение памяти для скриптов
  • Ограничения загрузки файлов и размеры данных POST
  • Уровни отчетности об ошибках и логирование
  • Параметры управления сеансами
  • Загрузка расширений (например, PDO, cURL, OPcache)
  • Ограничения безопасности, такие как disable_functions и open_basedir
  • Ограничения времени выполнения для предотвращения зависаний скриптов

Правильная настройка этих параметров — это не просто вопрос удобства, она напрямую влияет на стабильность приложения, уровень безопасности и опыт конечного пользователя. Неправильно настроенные параметры PHP являются основной причиной ошибок приложений, сбоев при загрузке файлов, исчерпания памяти и уязвимостей безопасности.

Если вы размещаете свои PHP-приложения на плане VPS Hosting, у вас есть полный доступ root для свободного изменения php.ini — что дает вам полный контроль над вашей PHP-средой.

2. Расположение файла php.ini

Расположение php.ini зависит от вашей операционной системы, версии PHP и используемого Server API (SAPI) (Apache mod_php, PHP-FPM или CLI). Вот три надежных метода для его поиска.

Метод 1: Использование командной строки (самый быстрый метод)

Откройте терминал или подключитесь через SSH и выполните:

php --ini

Пример вывода:

Configuration File (php.ini) Path: /etc/php/8.2/cli
Loaded Configuration File:         /etc/php/8.2/cli/php.ini
Scan for additional .ini files in: /etc/php/8.2/cli/conf.d
Additional .ini files parsed:      /etc/php/8.2/cli/conf.d/10-opcache.ini, ...

> Важно: PHP часто имеет отдельные файлы php.ini для разных SAPI. Версия CLI (/etc/php/8.2/cli/php.ini) используется при запуске PHP из командной строки, а версия Apache или PHP-FPM (/etc/php/8.2/apache2/php.ini или /etc/php/8.2/fpm/php.ini) используется для веб-запросов. Всегда редактируйте правильный файл для вашего случая.

Метод 2: Использование phpinfo() в браузере

Этот метод показывает точно, какой файл php.ini загружает ваш веб-сервер — это может отличаться от версии CLI.

Шаг 1: Создайте новый файл в корневой директории вашего сайта:

sudo nano /var/www/html/info.php

Шаг 2: Добавьте следующее содержимое:

<?php
phpinfo();
?>

Шаг 3: Сохраните файл, затем откройте браузер и перейдите на:

http://yourdomain.com/info.php

Шаг 4: Найдите строку “Loaded Configuration File” в верхней части вывода. Она отобразит полный путь к активному файлу php.ini.

> ⚠️ Предупреждение безопасности: Удалите info.php сразу после использования. Этот файл раскрывает конфиденциальные детали конфигурации сервера, которые могут использовать злоумышленники.

sudo rm /var/www/html/info.php

Метод 3: Использование php -r (быстрая однострочная команда)

php -r "echo php_ini_loaded_file();"

Это выводит путь загруженного файла php.ini прямо в ваш терминал — создание файла не требуется.

Типичные расположения php.ini по платформам

Платформа / КонфигурацияТипичный путь php.ini
Ubuntu/Debian + Apache (PHP 8.2)/etc/php/8.2/apache2/php.ini
Ubuntu/Debian + PHP-FPM (PHP 8.2)/etc/php/8.2/fpm/php.ini
Ubuntu/Debian + CLI (PHP 8.2)/etc/php/8.2/cli/php.ini
CentOS/RHEL + Apache/etc/php.ini
cPanel/WHM/usr/local/lib/php.ini
Windows (XAMPP)C:xamppphpphp.ini
macOS (Homebrew PHP 8.2)/opt/homebrew/etc/php/8.2/php.ini

3. Редактирование файла php.ini

Шаг 1: Сначала создайте резервную копию

Перед внесением любых изменений всегда создавайте резервную копию:

sudo cp /etc/php/8.2/apache2/php.ini /etc/php/8.2/apache2/php.ini.bak

Это позволяет быстро восстановить исходную конфигурацию, если что-то пойдет не так.

Шаг 2: Откройте файл в текстовом редакторе

Используйте nano для удобства начинающих:

sudo nano /etc/php/8.2/apache2/php.ini

Или используйте vim для более продвинутого редактирования:

sudo vim /etc/php/8.2/apache2/php.ini

Шаг 3: Навигация и редактирование директив

Файл php.ini большой (часто более 1500 строк). Используйте функцию поиска вашего редактора для перехода к определенным директивам:

  • В nano: Нажмите CTRL + W, затем введите имя директивы (например, memory_limit)
  • В vim: Нажмите /, затем введите имя директивы

Шаг 4: Сохранение и выход

  • nano: Нажмите CTRL + X, затем Y, затем Enter
  • vim: Нажмите ESC, введите :wq, затем нажмите Enter

4. Ключевые директивы php.ini объяснены

Вот подробный разбор наиболее важных php.ini директив, которые вы должны знать и настроить:

Ограничения памяти и ресурсов

; Maximum memory a single PHP script can allocate
memory_limit = 256M

; Maximum time (in seconds) a script is allowed to run
max_execution_time = 60

; Maximum time PHP will spend parsing request data
max_input_time = 120

; Maximum number of input variables (important for complex forms)
max_input_vars = 3000

Параметры загрузки файлов

; Whether file uploads are permitted
file_uploads = On

; Maximum size of an individual uploaded file
upload_max_filesize = 64M

; Maximum size of all POST data (must be >= upload_max_filesize)
post_max_size = 64M

; Maximum number of files that can be uploaded simultaneously
max_file_uploads = 20

> Практическое правило: post_max_size должен всегда быть равен или больше upload_max_filesize. Если post_max_size меньше, загрузки будут молча завершаться с ошибкой.

Отчетность об ошибках и логирование

; ---- DEVELOPMENT ENVIRONMENT ----
; Show all errors on screen (never use in production)
error_reporting = E_ALL
display_errors = On
display_startup_errors = On

; ---- PRODUCTION ENVIRONMENT ----
; Log errors to a file, never display them to users
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/error.log

Управление сеансами

; Where session data is stored on the server
session.save_path = "/var/lib/php/sessions"

; Session cookie lifetime in seconds (0 = until browser closes)
session.cookie_lifetime = 0

; Prevent JavaScript from accessing session cookies (XSS protection)
session.cookie_httponly = On

; Only send session cookies over HTTPS
session.cookie_secure = On

; Strict session ID mode (prevents session fixation attacks)
session.use_strict_mode = On

OPcache (ускоритель производительности)

OPcache значительно улучшает производительность PHP, сохраняя предкомпилированный байт-код скриптов в общей памяти:

opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1

5. Перезагрузка веб-сервера

Изменения в php.ini вступают в силу только после перезагрузки соответствующего сервиса. Используйте подходящую команду для вашей конфигурации:

Apache (mod_php)

sudo systemctl restart apache2
# or on CentOS/RHEL:
sudo systemctl restart httpd

Nginx + PHP-FPM

# Restart PHP-FPM (replace 8.2 with your PHP version)
sudo systemctl restart php8.2-fpm

# Restart Nginx
sudo systemctl restart nginx

Graceful Reload (Zero Downtime)

Для production-серверов используйте graceful reload, чтобы избежать разрыва активных соединений:

# Apache graceful reload
sudo systemctl reload apache2

# PHP-FPM graceful reload
sudo systemctl reload php8.2-fpm

Проверка работы сервисов

sudo systemctl status apache2
sudo systemctl status php8.2-fpm

6. Проверка ваших изменений

После перезагрузки сервера подтвердите, что ваши новые параметры активны, используя один из этих методов:

Метод 1: Command Line Grep

# Check memory_limit
php -i | grep memory_limit

# Check upload_max_filesize
php -i | grep upload_max_filesize

# Check multiple values at once
php -i | grep -E 'memory_limit|upload_max_filesize|post_max_size|max_execution_time'

Метод 2: phpinfo() Page

Временно пересоздайте файл info.php (не забудьте удалить его впоследствии) и найдите ваши измененные директивы. Измененные значения появятся в столбцах "Local Value" и "Master Value".

Метод 3: PHP One-Liner

php -r "echo ini_get('memory_limit');"

7. Продвинутые советы по оптимизации php.ini

Использование .htaccess для переопределения php.ini (только Apache)

Если вы находитесь на общем хостинге или не имеете доступа root, вы можете переопределить определенные php.ini параметры через .htaccess:

php_value memory_limit 256M
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 120

> Примечание: Это работает только если AllowOverride включен и хостинг-провайдер разрешает переопределение директив PHP.

Использование ini_set() в коде PHP

Для параметров, специфичных для приложения, вы можете переопределить значения php.ini во время выполнения в ваших PHP-скриптах:

<?php
ini_set('memory_limit', '512M');
ini_set('max_execution_time', '300');
?>

Файлы php.ini для каждого каталога (PHP-FPM)

С PHP-FPM вы можете применять различные параметры php.ini к разным виртуальным хостам или каталогам, настраивая файлы пула в /etc/php/8.2/fpm/pool.d/. Это особенно полезно при размещении нескольких приложений с разными требованиями.

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

8. Усиление безопасности через php.ini

Правильная настройка php.ini — один из наиболее эффективных способов защитить вашу PHP среду от распространённых атак.

Отключение опасных функций

; Prevent execution of system commands from PHP scripts
disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source

Ограничение доступа к файловой системе

; Limit PHP file access to specific directories
open_basedir = /var/www/html:/tmp

Скрытие информации о версии PHP

; Don't expose PHP version in HTTP headers
expose_php = Off

Отключение удалённого включения файлов

; Prevent PHP from including remote URLs (common attack vector)
allow_url_fopen = Off
allow_url_include = Off

Усиление безопасности сессий

session.cookie_httponly = On
session.cookie_secure = On
session.use_strict_mode = On
session.cookie_samesite = "Strict"

> Совет профессионала: Если вы запускаете сайт электронной коммерции или работаете с конфиденциальными данными пользователей, объедините вашу усиленную php.ini с действительным SSL сертификатом для шифрования всех данных при передаче. HTTPS обязателен для работы session.cookie_secure = On.

9. Распространённые ошибки php.ini, которых следует избегать

ОшибкаПочему это проблемаРешение
Установка memory_limit = -1 в productionПозволяет скриптам потреблять неограниченное количество RAM, вызывая сбои сервераУстановите разумный лимит, например 256M или 512M
display_errors = On в productionРаскрывает пользователям чувствительные пути файлов и учётные данные базы данныхУстановите на Off и используйте log_errors = On вместо этого
post_max_size < upload_max_filesizeВызывает молчаливые сбои загрузкиВсегда устанавливайте post_max_sizeupload_max_filesize
Редактирование неправильного php.iniИзменения не применяются к веб-запросамИспользуйте phpinfo() для подтверждения того, какой файл загружается вашим веб-сервером
Отсутствие перезагрузки сервера после измененийСтарые параметры остаются активнымиВсегда перезагружайте Apache или PHP-FPM после редактирования
Оставление info.php на сервереРаскрывает полную конфигурацию сервера злоумышленникамУдалите немедленно после использования
Установка allow_url_include = OnВключает атаки Remote File Inclusion (RFI)Всегда держите это Off

10. Заключение

Овладение конфигурацией php.ini — это фундаментальный навык для любого системного администратора или веб-разработчика. Правильные настройки могут означать разницу между медленным, уязвимым сервером и быстрой, безопасной, готовой к производству средой.

Подведем итоги ключевых выводов:

  • Всегда создавайте резервную копию php.ini перед внесением изменений
  • Определите правильный файл — CLI и веб-сервер SAPI часто используют разные файлы php.ini
  • Настройте ограничения ресурсов (memory_limit, max_execution_time, upload_max_filesize) в соответствии с потребностями вашего приложения
  • Усильте безопасность, отключив опасные функции, скрыв информацию о версии и ограничив доступ к файлам
  • Включите OPcache для значительного повышения производительности
  • Никогда не отображайте ошибки в production — логируйте их вместо этого
  • Перезагрузите веб-сервер после каждого изменения и проверьте с помощью phpinfo() или php -i

Среда хостинга, которую вы выбираете, также играет важную роль в том, насколько полный контроль вы имеете над конфигурацией PHP. С Выделенными серверами от AlexHost вы получаете полный, неограниченный доступ к конфигурации PHP вашего сервера — идеально для высоконагруженных приложений со сложными требованиями. Для небольших проектов или команд, которые только начинают работу, планы Общего веб-хостинга предоставляют управляемую среду, где многие параметры PHP предварительно оптимизированы для вас.

Регулярно пересматривайте конфигурацию php.ini по мере развития вашего приложения, обновления версий PHP и изменения ваших паттернов трафика. Хорошо настроенная среда PHP — это не одноразовая настройка — это постоянная практика, которая приносит дивиденды в производительности, надежности и безопасности.