Настройка PHP: редактирование php.ini и сравнение способов конфигурации

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

Настройка php.ini

Основной способ управления конфигурацией PHP - редактирование файла php.ini.

Как найти и изменить глобальные настройки PHP через php.ini?

Найти местоположение php.ini можно с помощью функции phpinfo() или выполнив команду php --ini в терминале. После редактирования файла необходимо перезапустить веб-сервер, чтобы изменения вступили в силу.

php --ini
# Результат:
# Configuration File (php.ini) Path: /etc/php/8.1/cli
# Loaded Configuration File: /etc/php/8.1/cli/php.ini

Php ubuntu (php на ubuntu)

Пример изменения параметра max_execution_time:

; Открыть php.ini и установить
max_execution_time = 120

Localhost php (настройка локального сервера php)

Проблема: После редактирования изменения не применяются. Решение: Проверить, какой именно php.ini загружается (возможно, используется конфигурация для другого SAPI). Убедиться, что сервер перезапущен (sudo systemctl restart apache2 или nginx -s reload).

Как настроить PHP через .htaccess для Apache?

Если нет доступа к основному php.ini, можно использовать директивы Apache в файле .htaccess:

php_value upload_max_filesize 64M
php_value post_max_size 68M
php_flag display_errors on

Php windows (php на windows)

Это подходит только для Apache с модулем mod_php. Для других серверов или PHP-FPM такой способ не работает.

Ошибка: 500 Internal Server Error из-за неверной директивы. Решение: Проверить синтаксис в логах Apache, использовать php_admin_value только в контексте <VirtualHost> при полном доступе.

Как изменить настройки PHP для отдельной директории с помощью user.ini?

При использовании PHP-FPM или CGI можно разместить файл .user.ini в корне сайта:

; .user.ini
upload_max_filesize = 32M
post_max_size = 36M
max_execution_time = 300

Admin php (администрирование php)

Файл проверяется при каждом запросе, изменения применяются без перезагрузки сервера. Директивы распространяются на все вложенные папки.

Проблема: Параметры из .user.ini не применяются. Решение: Убедиться, что директива user_ini.filename в основном php.ini не переопределена (по умолчанию .user.ini). Проверить, что PHP-FPM перезагрузил пул (можно перезапустить службу).

Как настроить PHP динамически через функцию ini_set()?

Для изменения параметров на уровне скрипта используется ini_set():

<?php
ini_set('memory_limit', '256M');
ini_set('max_execution_time', '30');
echo 'Новый лимит памяти: ' . ini_get('memory_limit');
?>

Php ini (настройка php.ini)

Новый лимит памяти: 256M

Change php (изменение php)

Такой способ подходит только для тех параметров, которые имеют режим PHP_INI_ALL или PHP_INI_USER. Например, safe_mode так изменить нельзя.

Ошибка: Изменение не влияет на предыдущий код или не сохраняется между запросами. Решение: Помнить, что ini_set() действует только в рамках текущего запроса. Для постоянных изменений использовать .htaccess или php.ini.

Как настроить PHP для Nginx через fastcgi параметры?

В конфигурации сервера Nginx можно передавать настройки через fastcgi_param:

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param PHP_VALUE "upload_max_filesize = 100M\npost_max_size = 100M";
    fastcgi_param PHP_ADMIN_VALUE "open_basedir = /var/www/html:/tmp";
    include fastcgi_params;
}

изменить настройки php (изменение настроек php)

Директива PHP_VALUE устанавливает параметры с режимом PHP_INI_ALL или PHP_INI_USER, а PHP_ADMIN_VALUE - для PHP_INI_SYSTEM.

Проблема: Параметры не применяются для поддиректорий. Решение: Разместить настройки в блоке location или if; для отдельных путей дублировать конфигурацию.

Как создать отдельный php.ini для консольных скриптов и веб-приложения?

CLI (Command Line Interface) и веб-сервер используют разные SAPI, каждый со своим php.ini. Можно указать путь при запуске скрипта:

php -c /path/to/custom-php.ini script.php

Php ini memory (настройка memory_limit в php)

Или задать переменную окружения PHPRC:

export PHPRC=/etc/php/custom/php.ini
php script.php

Для веб-сервера можно указать другой путь через пул PHP-FPM (директива php_admin_value в конфигурации пула).

Проблема: Ошибка загрузки расширений. Решение: Убедиться, что путь к расширениям (extension_dir) корректен для выбранного php.ini.

- Php ini upload (настройка загрузки файлов в php (upload_max_filesize, post_max_size))
- Php ini set error (настройка отображения ошибок в php (display_errors, error_reporting))
- Php ini extension (настройка расширений php (extension_dir, extension))

Расширенные примеры настройки параметров php.ini

Пример 1: Настройка лимитов загрузки файлов

Для разрешения загрузки больших файлов необходимо согласованно изменить три параметра:

Пример
; php.ini
file_uploads = On
upload_max_filesize = 128M
post_max_size = 132M
max_input_time = 60
memory_limit = 256M

Значение post_max_size должно быть немного больше upload_max_filesize, так как форма передачи включает дополнительные заголовки. memory_limit влияет на обработку загруженного файла.

Проверка:

Пример
<?php
$post = ini_get('post_max_size');
$upload = ini_get('upload_max_filesize');
echo "post_max_size: $post\n";
echo "upload_max_filesize: $upload\n";
?>
post_max_size: 132M
upload_max_filesize: 128M

Пример 2: Настройка времени выполнения и памяти для длительных задач

Для скриптов генерации отчётов или парсинга данных:

Пример
; php.ini
max_execution_time = 600
max_input_time = 600
memory_limit = 512M

Если скрипт работает с большими объёмами данных, может потребоваться увеличить pcre.backtrack_limit и pcre.jit_stack_size:

Пример
pcre.backtrack_limit = 10000000
pcre.jit_stack_size = 256000

Результат проверки (скрипт-таймер):

Пример
<?php
set_time_limit(0); // отключает ограничение в коде
$start = microtime(true);
// долгая операция
sleep(300);
echo 'Выполнено за ' . (microtime(true)-$start) . ' сек.';
?>
Выполнено за 300.001 сек.

Пример 3: Настройка сессий и оптимизация

Пример
; php.ini
session.save_handler = files
session.save_path = "/var/lib/php/sessions"
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.cookie_lifetime = 0
session.use_strict_mode = 1
session.use_only_cookies = 1

Для повышения безопасности:

Пример
session.cookie_httponly = 1
session.cookie_secure = 1  ; только для HTTPS
session.cookie_samesite = "Lax"

Проблема утечки сессий на общем хостинге - решение указать уникальный session.save_path для каждого сайта или использовать Redis.

Пример 4: Управление выводом ошибок и логированием

Пример
; Для разработки
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = /var/log/php_errors.log

; Для production
display_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
expose_php = Off

Пример лога ошибок:

Пример
[22-Apr-2025 14:35:12 UTC] PHP Warning:  Division by zero in /var/www/html/test.php on line 5

Проблема: Лог ошибок пустеет. Решение: Проверить права на файл error_log (должен быть доступен на запись процессу PHP) и убедиться, что log_errors = On.

Пример 5: Кэширование через OPcache

Пример
[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
opcache.enable_cli=1

Для активации OPcache в PHP-FPM может потребоваться перезагрузка пула. Проверка:

Пример
<?php
var_dump(opcache_get_status()['opcache_enabled']);
?>
bool(true)

Пример 6: Настройка часового пояса и локали

Пример
date.timezone = "Europe/Moscow"
; или динамически
setlocale(LC_ALL, 'ru_RU.UTF-8');

Ошибка: функция date() возвращает неверное время - проверить, что date.timezone установлен, иначе PHP использует UTC и выдаёт предупреждение.

Пример 7: Ограничение доступа через open_basedir

Пример
; php.ini
open_basedir = /var/www/html:/tmp:/usr/share/php

Если скрипт пытается открыть файл вне указанных путей, PHP выдаёт ошибку. Пример:

Пример
<?php
$f = fopen('/etc/passwd', 'r'); // будет заблокировано
?>
Warning: fopen(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/var/www/html:/tmp:/usr/share/php)

Пример 8: Настройка upload_tmp_dir для загрузок

Пример
upload_tmp_dir = /var/php_uploads

Папка должна существовать и быть доступной на запись для пользователя PHP (например, www-data). Если не указана, используется системная временная папка.

Пример проверки:

Пример
<?php
echo 'Временная папка: ' . sys_get_temp_dir();
?>
Временная папка: /var/php_uploads

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

En
Php ini (php)