Настройка PHP: редактирование php.ini и сравнение способов конфигурации
Настройка 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.iniPhp ubuntu (php на ubuntu)
Пример изменения параметра max_execution_time:
; Открыть php.ini и установить
max_execution_time = 120Localhost 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 = 300Admin 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.phpPhp 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
Пример 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