Ini restore: примеры (PHP)
ini_restore(string $option): voidФункция 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
Функция 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' # Изменение
# Для сброса нужно перезагрузить конфигурацию из файлаВ Node.js глобальные параметры среды могут устанавливаться через переменные окружения или аргументы командной строки. Для управления конфигурацией приложения используются объекты или внешние пакеты, такие как dotenv.
// Пример с объектом конфигурации
let config = {
maxMemory: process.env.MAX_MEMORY || '512MB'
};
console.log(config.maxMemory);
config.maxMemory = '1GB'; // Временное изменение
// Сброс требует повторного чтения из process.envIni 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 на предмет изменений в списке изменяемых во время выполнения директив.
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
// Исходный уровень отображения ошибок
$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
// Функция для сброса группы настроек
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