Конфигурирование PHP: редактирование php.ini и применение config.php
Основной подход: редактирование php.ini
Центральный файл конфигурации PHP - php.ini
При стандартной установке PHP интерпретатор считывает параметры из файла php.ini, расположение которого зависит от операционной системы и способа сборки. Основной способ повлиять на поведение PHP - изменить значения директив в этом файле.
; Пример содержимого php.ii
memory_limit = 256M
max_execution_time = 60
display_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICTShort open tags php (включение коротких тегов php)
После внесения изменений необходимо перезапустить веб-сервер (Apache, Nginx) или, если PHP работает как модуль, перезагрузить конфигурацию. Например, для Apache:
sudo systemctl reload apache2Php memory limit (лимит памяти в php)
Цели использования:
- Глобальная настройка параметров для всех скриптов на сервере.
- Установка лимитов памяти, времени выполнения, уровней ошибок, загрузки файлов.
Типичные проблемы и решения:
- Изменения не вступают в силу. Проверьте, что редактируется правильный файл (вывод phpinfo() показывает путь). После правки обязательно перезапустите веб-сервер.
- Директива не применяется. Некоторые директивы (например,
safe_mode) помечены какPHP_INI_SYSTEM- их можно менять только в php.ini или.htaccess(для Apache).
Как изменить настройки для конкретной директории сайта без доступа к основному php.ini?
Вариант 1: Файлы .user.ini
Начиная с PHP 5.3.0, можно использовать файл .user.ini, который размещается в корневой папке веб-приложения. Он применяется только к скриптам в этой директории и её поддиректориях.
; .user.ini
upload_max_filesize = 10M
post_max_size = 12M
max_execution_time = 120
Php файл конфигурации (файл конфигурации php (php.ini, config.php))
Файл автоматически считывается при каждом запросе, перезапуск сервера не требуется. Однако директивы, помеченные как PHP_INI_SYSTEM, изменять нельзя.
Проблема: .user.ini не работает, если включён opcache.
OpCache может кешировать прочитанные параметры. В таком случае либо отключите кеширование для пользовательских ini-файлов (opcache.revalidate_freq = 0), либо очищайте кеш при каждом изменении.
Как переопределить настройки в Apache через .htaccess?
Вариант 2: Директивы Apache для PHP
Если PHP работает как модуль Apache, можно использовать .htaccess с директивами php_value и php_flag.
# .htaccess
php_value upload_max_filesize 20M
php_flag display_errors On
Директивы действуют для всех файлов в текущей папке. Не все параметры допустимы: можно применять только те, что помечены PHP_INI_ALL или PHP_INI_PERDIR.
Ошибка 500 при неправильном синтаксисе.
Проверьте, что модуль mod_php включён. Значения должны быть заключены в кавычки (опционально), пробелы недопустимы. Для булевых значений используйте On/Off.
Как задать конфигурацию программно без прав на сервер?
Вариант 3: Функция ini_set()
В коде PHP можно изменить многие директивы на время выполнения скрипта с помощью ini_set(). Это полезно, когда у вас нет доступа к php.ini или .htaccess.
<?php
// Увеличиваем лимит памяти для текущего скрипта
ini_set('memory_limit', '512M');
// Включаем вывод ошибок
ini_set('display_errors', '1');
?>
Ограничения:
- Не все директивы можно менять во время выполнения (только
PHP_INI_ALLиPHP_INI_USER). - Изменение вступает в силу только для текущего запроса.
ini_set() не меняет значение - что делать?
Убедитесь, что директива поддерживает изменение на этапе выполнения. Проверьте документацию: например, max_execution_time можно изменить, а register_globals (устаревшая) - нет.
Как использовать собственный конфигурационный файл приложения (config.php)?
Вариант 4: Пользовательский config.php
Часто в проектах создают файл config.php, который подключается в начале скрипта и содержит переменные для настройки базы данных, путей, параметров. Это не влияет на директивы PHP напрямую, но позволяет централизованно хранить настройки приложения.
<?php
// config.php
return [
'db_host' => 'localhost',
'db_name' => 'app_db',
'db_user' => 'admin',
'db_pass' => 'secret',
'upload_max_size' => 10,
'debug' => true
];
?>
Затем файл подключается через require 'config.php'; и данные доступны в виде массива. Такой подход не позволяет менять системные настройки PHP, но даёт гибкость в логике приложения.
Ошибки безопасности: файл конфигурации должен быть недоступен через веб.
Размещайте config.php за пределами DocumentRoot, либо защитите его через .htaccess: <Files "config.php"> Deny from all </Files>.
Расширенные примеры работы с конфигурацией PHP
Пример 1: Проверка текущих значений директив и их источника
<?php
// Вывод информации о конфигурации
echo 'memory_limit: ' . ini_get('memory_limit') . "\n";
echo 'upload_max_filesize: ' . ini_get('upload_max_filesize') . "\n";
echo 'max_execution_time: ' . ini_get('max_execution_time') . "\n";
// Узнаём, можно ли изменить директиву во время выполнения
$directive = 'allow_url_fopen';
if (ini_get($directive) === false) {
echo "Директива '$directive' не доступна.\n";
} else {
echo "Значение '$directive': " . ini_get($directive) . "\n";
}
?>
memory_limit: 256M upload_max_filesize: 2M max_execution_time: 30 Значение 'allow_url_fopen': 1
Пояснение:
Функция ini_get() возвращает текущее значение директивы. Она полезна для отладки и динамической настройки.
Пример 2: Динамическое изменение лимита времени выполнения для длительных задач
<?php
// Устанавливаем неограниченное время выполнения
ini_set('max_execution_time', 0);
// Имитация долгой операции
$start = microtime(true);
for ($i = 0; $i < 1e7; $i++) {
// что-то делаем
}
$end = microtime(true);
echo "Скрипт отработал за " . round($end - $start, 2) . " секунд.\n";
?>
Скрипт отработал за 1.23 секунд.
Пояснение:
Установка нуля снимает ограничение времени выполнения. Но если скрипт зависнет, он может работать бесконечно - используйте с осторожностью. Рекомендуется увеличивать лимит только для конкретных заданий.
Пример 3: Использование phpinfo() для диагностики
<?php
// Вывести полную информацию о конфигурации PHP
phpinfo();
?>
Пояснение:
Функция phpinfo() отображает таблицы со всеми директивами, их текущими значениями, а также путями к php.ini и модулям. Это незаменимый инструмент при поиске проблем с конфигурацией. Удалите этот файл после использования из-за раскрытия информации.
Пример 4: Сравнение влияния разных способов установки директивы
<?php
// Устанавливаем в скрипте
echo "До ini_set: " . ini_get('display_errors') . "\n";
ini_set('display_errors', '1');
echo "После ini_set: " . ini_get('display_errors') . "\n";
// Если директива была изменена через .htaccess или php.ini, ini_set() может переопределить её
// только если разрешён режим PHP_INI_ALL
?>
До ini_set: 0 После ini_set: 1
Пояснение:
Этот пример демонстрирует, как ini_set() временно переопределяет значение. Заметьте, что изменение не сохраняется между запросами.
Пример 5: Создание виртуального хоста с индивидуальными настройками PHP через Apache
<VirtualHost *:80>
ServerName myapp.local
DocumentRoot /var/www/myapp
<Directory /var/www/myapp>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
# Установка PHP-директив для этого хоста
php_value error_reporting E_ALL
php_flag display_errors On
php_value memory_limit 512M
</Directory>
</VirtualHost>
Пояснение:
Виртуальный хост позволяет задать уникальные настройки для каждого сайта. Директивы php_value и php_flag работают аналогично .htaccess, но на уровне конфигурации Apache. После изменения перезагрузите конфигурацию: sudo systemctl reload apache2.
Пример 6: Использование .user.ini для разных поддиректорий
# /var/www/site/admin/.user.ini
memory_limit = 128M
max_execution_time = 90
# /var/www/site/upload/.user.ini
upload_max_filesize = 200M
post_max_size = 210M
Пояснение:
Файлы .user.ini размещаются в каждой папке, для которой нужны особые параметры. Они применяются только к скриптам, расположенным в этой папке и её подпапках. Перезапуск сервера не требуется.
Пример 7: Чтение пользовательского конфигурационного файла в приложении
<?php
// config.php (за пределами web-root)
$config = [
'db' => [
'dsn' => 'mysql:host=localhost;dbname=test',
'user' => 'root',
'password' => 'pass123'
],
'app' => [
'timezone' => 'Europe/Moscow',
'debug' => false
]
];
return $config;
// index.php
$settings = require __DIR__ . '/../config.php';
echo $settings['app']['timezone']; // Europe/Moscow
?>
Пояснение:
Файл возвращает массив, который затем присваивается переменной. Такой подход удобен для хранения настроек, не затрагивающих интерпретатор PHP.