Ini restore: примеры (PHP)

Восстановление настроек PHP с помощью ini_restore
Раздел: Конфигурация PHP
ini_restore(string $option): void
Основы функции ini_restore

Функция ini_restore предназначена для восстановления значения конфигурационной настройки PHP до её исходного значения, которое было определено в файле php.ini или других конфигурационных файлах. Её применение актуально, когда требуется временно изменить параметр выполнения скрипта, а затем вернуть его в исходное состояние.

Функция принимает всего один аргумент – строку $option, которая указывает имя настраиваемой директивы. Имена директив соответствуют тем, что используются в файле php.ini, например, display_errors или memory_limit. Функция не возвращает значения.

Базовые примеры применения

Пример изменения и последующего восстановления директивы display_errors.

// Запоминаем исходное значение
echo 'Исходное значение display_errors: ' . ini_get('display_errors') . "\n";

// Временно отключаем вывод ошибок
ini_set('display_errors', '0');
echo 'Значение после ini_set: ' . ini_get('display_errors') . "\n";

// Восстанавливаем исходное значение
ini_restore('display_errors');
echo 'Значение после ini_restore: ' . ini_get('display_errors') . "\n";
Исходное значение display_errors: 1
Значение после ini_set: 0
Значение после ini_restore: 1

Пример работы с memory_limit.

ini_set('memory_limit', '64M');
echo 'Временный лимит: ' . ini_get('memory_limit') . "\n";
ini_restore('memory_limit');
echo 'Восстановленный лимит: ' . ini_get('memory_limit');
Временный лимит: 64M
Восстановленный лимит: 128M
Похожие функции в PHP

Функция ini_set используется для установки нового значения конфигурационной директивы на время выполнения скрипта. Является парной к ini_restore. Её предпочтительно использовать, когда известно конкретное новое значение параметра.

Функция ini_get позволяет получить текущее значение директивы. Она полезна для проверки состояния до и после изменений. Для комплексного управления параметрами часто используется вместе с ini_set и ini_restore.

Функция ini_get_all возвращает массив всех доступных конфигурационных директив и их значений. Её применение удобно для отладки и анализа общей конфигурации среды.

Аналоги в других языках

Ini restore в Python

В Python управление конфигурацией обычно осуществляется через модули, такие как configparser. Прямого аналога для временного изменения глобальных настроек интерпретатора не существует. Изменения часто носят более локальный характер.

import configparser
config = configparser.ConfigParser()
config.read('settings.ini')
print(config['Section']['parameter'])  # Чтение
config['Section']['parameter'] = 'new_value'  # Изменение
# Для сброса нужно перезагрузить конфигурацию из файла
JavaScript (Node.js)

В Node.js глобальные параметры среды могут устанавливаться через переменные окружения или аргументы командной строки. Для управления конфигурацией приложения используются объекты или внешние пакеты, такие как dotenv.

// Пример с объектом конфигурации
let config = {
  maxMemory: process.env.MAX_MEMORY || '512MB'
};
console.log(config.maxMemory);
config.maxMemory = '1GB'; // Временное изменение
// Сброс требует повторного чтения из process.env

Ini restore в MySQL

В MySQL сессионные переменные могут быть изменены с помощью команды SET. Для сброса к глобальному значению часто требуется явное указание этого значения или переподключение.

-- Установка сессионной переменной
SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
-- Сброс к глобальному значению требует знания этого значения
SET SESSION sql_mode = @@GLOBAL.sql_mode;
Распространенные ошибки

Попытка восстановления несуществующей или не измененной ранее директивы.

// Ошибки не произойдет, но и эффекта не будет
ini_restore('non_existent_directive');
echo 'Скрипт продолжает работу.';
Скрипт продолжает работу.

Ожидание восстановления значения после завершения скрипта.

// Изменение действительно только в рамках текущего запроса
ini_set('max_execution_time', '300');
// После завершения скрипта значение сбрасывается автоматически
// Явный вызов ini_restore нужен только если нужно восстановить раньше

Использование функции для директив, которые не могут быть изменены во время выполнения.

// Для некоторых директив ini_set может вернуть false
$result = ini_set('extension_dir', '/new/path');
if ($result === false) {
    echo 'Эту директиву нельзя изменить во время выполнения.';
}
// Соответственно, ini_restore для неё также не имеет эффекта
История изменений функции

Функция ini_restore присутствует в PHP начиная с версии 4.0. Её поведение оставалось стабильным на протяжении многих выпусков. В PHP 8.0 не было внесено значительных изменений в работу этой функции. Однако, с развитием языка появляются новые конфигурационные директивы, которые становятся доступны для управления через ini_set и ini_restore. Рекомендуется проверять документацию для конкретной версии PHP на предмет изменений в списке изменяемых во время выполнения директив.

Расширенные примеры использования
Временное увеличение лимитов для сложной операции
Пример php
function processLargeData() {
    // Сохраняем оригинальные значения
    $original_memory = ini_get('memory_limit');
    $original_time = ini_get('max_execution_time');

    // Увеличиваем лимиты
    ini_set('memory_limit', '2048M');
    ini_set('max_execution_time', '600');

    // Выполняем ресурсоемкую операцию
    echo 'Обработка данных...' . "\n";
    // Имитация работы
    $data = str_repeat('x', 1000000);

    // Автоматическое восстановление при выходе из функции не происходит
    // Восстанавливаем вручную
    ini_restore('memory_limit');
    ini_restore('max_execution_time');

    echo 'Лимиты восстановлены.' . "\n";
    echo 'memory_limit: ' . ini_get('memory_limit') . "\n";
    echo 'max_execution_time: ' . ini_get('max_execution_time') . "\n";
}

processLargeData();
Обработка данных...
Лимиты восстановлены.
memory_limit: 128M
max_execution_time: 30
Безопасное изменение настроек ошибок для блока кода
Пример php
// Исходный уровень отображения ошибок
$originalErrorReporting = error_reporting();
$originalDisplayErrors = ini_get('display_errors');

// Настройка для отладки
error_reporting(E_ALL);
ini_set('display_errors', '1');

try {
    // Код, который может генерировать предупреждения
    $result = 10 / 0; // Деление на ноль для примера
} catch (Throwable $e) {
    echo 'Произошла ошибка: ' . $e->getMessage() . "\n";
} finally {
    // Гарантированное восстановление настроек
    error_reporting($originalErrorReporting);
    ini_restore('display_errors');
}

// Проверка восстановления
echo 'display_errors после восстановления: ' . ini_get('display_errors');
Warning: Division by zero in ...
Произошла ошибка: Division by zero
display_errors после восстановления: 0
Сброс группы связанных параметров
Пример php
// Функция для сброса группы настроек
function restoreIniSettings(array $directives) {
    foreach ($directives as $directive) {
        ini_restore($directive);
    }
}

// Изменяем несколько параметров
ini_set('error_log', '/tmp/php_errors.log');
ini_set('log_errors', '1');
ini_set('ignore_repeated_errors', '1');

// Сброс всей группы
restoreIniSettings(['error_log', 'log_errors', 'ignore_repeated_errors']);

// Проверка
foreach (['error_log', 'log_errors'] as $dir) {
    echo $dir . ': ' . ini_get($dir) . "\n";
}
error_log: no value
log_errors: 0

PHP ini_restore function comments

En
Ini restore Restores the value of a configuration option