Конфигурирование PHP: редактирование php.ini и применение config.php

Раздел: Администрирование PHP -> Настройка конфигурации 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_STRICT

Short open tags php (включение коротких тегов php)

После внесения изменений необходимо перезапустить веб-сервер (Apache, Nginx) или, если PHP работает как модуль, перезагрузить конфигурацию. Например, для Apache:

sudo systemctl reload apache2

Php 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.

Файл конфигурации PHP (php.ini, config.php) - comments

En
Php файл конфигурации (php)