Практическое руководство по конфигурированию PHP

Раздел: Администрирование PHP -> Настройка PHP

Основные подходы к конфигурированию PHP

Основное решение: редактирование главного конфигурационного файла php.ini

Для серверных установок PHP наиболее надёжным и полным способом задания параметров является изменение файла php.ini. Этот файл загружается при запуске PHP и применяется ко всем скриптам, если не переопределён другими методами.

Типовая последовательность действий:

  1. Найти расположение php.ini с помощью php --ini или функции phpinfo().
  2. Создать резервную копию оригинального файла.
  3. Отредактировать нужные директивы (например, memory_limit = 256M).
  4. Перезапустить веб-сервер или 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).

- Php ini set error (настройка отображения ошибок в php (display_errors, error_reporting))
- Php ini extension (настройка расширений php (extension_dir, extension))
- Php ini sessions (настройка сессий в php (session.*))

Расширенные примеры и нестандартные ситуации

Пример 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

Администрирование PHP - comments

En
Admin php (php)