Практическое руководство по конфигурированию PHP
Основные подходы к конфигурированию PHP
Основное решение: редактирование главного конфигурационного файла php.ini
Для серверных установок PHP наиболее надёжным и полным способом задания параметров является изменение файла php.ini. Этот файл загружается при запуске PHP и применяется ко всем скриптам, если не переопределён другими методами.
Типовая последовательность действий:
- Найти расположение php.ini с помощью
php --iniили функцииphpinfo(). - Создать резервную копию оригинального файла.
- Отредактировать нужные директивы (например,
memory_limit = 256M). - Перезапустить веб-сервер или PHP-FPM, чтобы изменения вступили в силу.
# Определение пути к php.ini из командной строки
php --ini
# Пример вывода (Linux):
# Configuration File (php.ini) Path: /etc/php/8.2/cli/php.ini
# Loaded Configuration File: /etc/php/8.2/cli/php.ini
Php ubuntu (php на ubuntu)
# Проверка текущего значения memory_limit из PHP-скрипта
<?php
echo ini_get('memory_limit'); // 128M
?>
Localhost php (настройка локального сервера php)
128M
Php windows (php на windows)
Типичная ошибка: изменения не применяются
Проблема: после редактирования php.ini значение директивы не меняется в скрипте.
Причины:
- Не перезапущен веб-сервер или PHP-FPM.
- Редактируется не тот php.ini (разные для CLI и CGI/FastCGI).
- Директива переопределена в другом месте (.htaccess, .user.ini, ini_set()).
Решение: проверить, какой файл загружен, через phpinfo(), и перезапустить службу.
Как изменить параметры PHP для конкретной директории без доступа к глобальному php.ini?
Вариант A: файл .user.ini
Начиная с PHP 5.3.0, можно поместить файл .user.ini в корень веб-приложения. Директивы из него применяются только к скриптам в этой папке и её подпапках. Удобно для shared-хостинга.
# Пример .user.ini
upload_max_filesize = 10M
post_max_size = 12M
max_execution_time = 60
Admin php (администрирование php)
Как динамически менять настройки во время выполнения скрипта?
Вариант B: функция ini_set()
ini_set() изменяет значение директивы только для текущего скрипта. Не все директивы можно переопределить (некоторые помечены как PHP_INI_SYSTEM).
// Установка максимального времени выполнения в секундах
ini_set('max_execution_time', 300);
echo ini_get('max_execution_time'); // 300
// Попытка изменить memory_limit (обычно работает)
ini_set('memory_limit', '512M');
echo ini_get('memory_limit'); // 512M
Php ini (настройка php.ini)
300 512M
Change php (изменение php)
Проблема: ini_set() не меняет значения, если режим директивы PHP_INI_SYSTEM.
Пример: display_errors имеет режим PHP_INI_ALL, а max_input_vars - PHP_INI_PERDIR. Но upload_tmp_dir - PHP_INI_SYSTEM, изменить можно только в php.ini.
Решение: использовать ini_get_all() для просмотра режима доступности.
Как настроить PHP через веб-сервер (Apache, Nginx)?
Вариант C: директивы в конфигурации сервера
В Apache можно использовать php_value и php_flag в .htaccess или виртуальном хосте. Для Nginx с PHP-FPM передаются через fastcgi_param.
# .htaccess (Apache):
php_value upload_max_filesize 20M
php_value post_max_size 22M
php_flag display_errors On
# В виртуальном хосте Apache (httpd.conf):
<Directory /var/www/site>
php_value memory_limit 256M
</Directory>
изменить настройки php (изменение настроек php)
# Nginx + PHP-FPM: установка параметров через fastcgi_param
location ~ \.php$ {
include fastcgi_params;
fastcgi_param PHP_VALUE "upload_max_filesize = 20M\npost_max_size = 22M";
fastcgi_param PHP_FLAG "display_errors = On";
}
Php ini memory (настройка memory_limit в php)
Как задать настройки для конкретного пула PHP-FPM?
Вариант D: настройки в конфигурации пула PHP-FPM
В файле pool.d/yourpool.conf можно указать секцию php_admin_value и php_admin_flag. Эти значения нельзя переопределить через ini_set().
; /etc/php/8.2/fpm/pool.d/mysite.conf
[mysite]
user = www-data
pm.max_children = 10
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 120
php_admin_flag[display_errors] = Off
Php ini linux (настройка php.ini в linux/ubuntu)
Как быстро проверить, какая директива используется?
Вариант E: консольная утилита php -i
Вывод всех настроек в терминал:
php -i | grep memory_limit
php -r "echo ini_get('upload_max_filesize');"
Проблема: после изменений в php.ini не видно эффекта в веб-версии, хотя в CLI всё работает.
Причина: веб-сервер и PHP-FPM использует отдельный php.ini (часто в /etc/php/8.2/fpm/php.ini), а CLI использует свой (/etc/php/8.2/cli/php.ini).
Решение: редактировать файл, соответствующий SAPI (fpm, apache2handler, cgi).
Расширенные примеры и нестандартные ситуации
Пример 1: Получение полного списка доступных директив с режимами
<?php
$all = ini_get_all();
echo '<table>';
foreach ($all as $key => $value) {
echo '<tr><td>' . htmlspecialchars($key) . '</td><td>' . $value['local_value'] . '</td><td>' . $value['access'] . '</td></tr>';
}
echo '</table>';
?>
(вывод HTML-таблицы со всеми директивами, их текущими значениями и уровнем доступа: 1 - PHP_INI_USER, 2 - PHP_INI_PERDIR, 4 - PHP_INI_SYSTEM, 7 - PHP_INI_ALL)
Пример 2: Изменение max_input_vars (PHP_INI_PERDIR) через .user.ini и проверка
# .user.ini в корне сайта
max_input_vars = 2000
<?php
echo 'max_input_vars: ' . ini_get('max_input_vars');
?>
max_input_vars: 2000
Пример 3: Установка временной зоны и отключение ошибок только для одного скрипта
<?php
// Переопределяем локаль, если это разрешено
ini_set('date.timezone', 'Europe/Moscow');
ini_set('error_reporting', 0);
ini_set('display_errors', 0);
// Проблемный код...
trigger_error('Это сообщение не будет выведено', E_USER_WARNING);
echo date('Y-m-d H:i:s');
?>
2025-03-20 14:30:00
При этом error_log будет записан (если настроен), так как log_errors не отключали.
Пример 4: Использование PHP-FPM для разделения конфигураций между виртуальными хостами
# /etc/php/8.2/fpm/pool.d/site1.conf
[site1]
listen = /run/php/php8.2-fpm-site1.sock
php_admin_value[upload_max_filesize] = 50M
php_admin_value[post_max_size] = 55M
# /etc/php/8.2/fpm/pool.d/site2.conf
[site2]
listen = /run/php/php8.2-fpm-site2.sock
php_admin_value[upload_max_filesize] = 10M
php_admin_value[post_max_size] = 12M
В Nginx для каждого сайта указывается свой сокет:
# site1.example.com
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm-site1.sock;
}
# site2.example.com
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm-site2.sock;
}
Пример 5: Редактирование php.ini через sed (автоматизация)
# Изменение memory_limit на 512M в конфиге PHP-FPM
sed -i 's/^memory_limit = .*/memory_limit = 512M/' /etc/php/8.2/fpm/php.ini
# Проверка
grep '^memory_limit' /etc/php/8.2/fpm/php.ini
memory_limit = 512M
Пример 6: Проблема с неправильным синтаксисом в php.ini
# Неправильно: пробел после знака '=' не допускается?
memory_limit = 256M # OK
memory_limit=256M # OK
memory_limit =256M # OK
memory_limit= 256M # OK
# Ошибка: значение без единицы измерения
memory_limit = 256
# Это может привести к тому, что директива будет проигнорирована, и PHP использует значение по умолчанию (128M).
Проблема: после редактирования php.ini веб-сервер возвращает 500 Internal Server Error.
Причины:
- Ошибка синтаксиса в php.ini (например, лишняя точка с запятой в середине строки).
- Задание несуществующей директивы.
- Неверная единица измерения (например,
256GBвместо256G).
Решение: проверить синтаксис с помощью php -l /path/to/php.ini или php-fpm8.2 -t для FPM.
# Проверка синтаксиса php.ini
php -l /etc/php/8.2/fpm/php.ini
# Ожидаемый результат:
No syntax errors detected in /etc/php/8.2/fpm/php.ini