Parse ini file: примеры (PHP)
parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array|falseФункция parse_ini_file
Функция parse_ini_file() в PHP предназначена для чтения и разбора INI-файлов. Она преобразует структурированные данные из файла конфигурации формата INI в ассоциативный или многомерный массив.
Функция часто применяется для загрузки настроек приложений, конфигурационных параметров модулей или любых других параметров, хранящихся в простом текстовом формате INI. Использование parse_ini_file упрощает управление конфигурацией без необходимости написания собственного парсера.
Функция принимает три параметра:
- $filename (string, обязательный) - Путь к INI-файлу.
- $process_sections (bool, необязательный, по умолчанию false) - Если установлено в true, функция возвращает многомерный массив с включением секций. Если false, возвращает плоский ассоциативный массив.
- $scanner_mode (int, необязательный) - Может принимать значения констант INI_SCANNER_NORMAL (по умолчанию) или INI_SCANNER_RAW. INI_SCANNER_RAW отключает обработку значений (не преобразует специальные символы). С версии PHP 5.6.1 добавлена INI_SCANNER_TYPED для сохранения типов данных.
Примеры использования
Содержимое файла config.ini:
database.host = localhost
database.user = root
database.pass = secretКод PHP:
$config = parse_ini_file('config.ini');
print_r($config);Результат:
Array
(
[database.host] => localhost
[database.user] => root
[database.pass] => secret
)Содержимое файла с секциями:
[database]
host = localhost
user = root
[application]
name = MyApp
debug = trueКод PHP:
$config = parse_ini_file('config_sections.ini', true);
print_r($config);Результат:
Array
(
[database] => Array
(
[host] => localhost
[user] => root
)
[application] => Array
(
[name] => MyApp
[debug] => 1
)
); Файл example.ini
path = /usr/local/bin
url = http://example.com
bool_true = on
bool_false = off
number = 42Код PHP:
$normal = parse_ini_file('example.ini', false, INI_SCANNER_NORMAL);
$raw = parse_ini_file('example.ini', false, INI_SCANNER_RAW);
$typed = parse_ini_file('example.ini', false, INI_SCANNER_TYPED);
echo 'NORMAL: '; var_dump($normal['bool_true']);
echo 'RAW: '; var_dump($raw['bool_true']);
echo 'TYPED: '; var_dump($typed['bool_true']);Результат:
NORMAL: string(1) "1" RAW: string(2) "on" TYPED: bool(true)
Альтернативы в PHP
Аналогична parse_ini_file, но работает со строкой, содержащей данные INI, а не с файлом. Полезна когда конфигурация получена из базы данных или сетевого запроса.
Для нестандартных форматов можно использовать комбинацию file_get_contents() или file() с последующей обработкой строк. parse_ini_file предпочтительнее для стандартных INI-файлов.
Для сложных структур данных часто применяют json_decode() или yaml_parse(). JSON поддерживает вложенные структуры лучше, чем INI. YAML более человекочитаем, но требует установки расширения.
Аналоги в других языках
Parse ini file в Python
Модуль configparser предоставляет класс ConfigParser для работы с INI-файлами.
import configparser
config = configparser.ConfigParser()
config.read('config.ini')
db_host = config['database']['host']Популярный пакет ini преобразует INI в объект.
const ini = require('ini');
const fs = require('fs');
const config = ini.parse(fs.readFileSync('config.ini', 'utf-8'));
console.log(config.database.host);Parse ini file в MySQL
В MySQL нет встроенного парсера INI. Обычно конфигурация считывается средствами языка программирования, под которым работает приложение, или через системные переменные.
В отличие от PHP, Python и JavaScript обычно требуют явного импорта библиотек. Поддержка типизации данных также различается между реализациями.
Типичные ошибки
Функция возвращает false и генерирует предупреждение, если файл не найден.
$result = parse_ini_file('missing.ini');
var_dump($result);Warning: parse_ini_file(missing.ini): failed to open stream: No such file or directory bool(false)
Строки без знака равенства игнорируются, что может привести к неожиданным результатам.
; Файл error.ini
key_without_value
correct = valueprint_r(parse_ini_file('error.ini'));Array
(
[correct] => value
)Использование null, yes, no, true, false, on, off в качестве значений может привести к их преобразованию в логические значения в режиме INI_SCANNER_NORMAL.
Изменения в новых версиях PHP
Добавлена константа INI_SCANNER_TYPED для сохранения типов значений при разборе.
Добавлена поддержка escape-последовательностей в двойных кавычках. В более ранних версиях они не обрабатывались.
Изменений в поведении функции не было. Функция продолжает работать в соответствии с документацией предыдущих версий.
Расширенные примеры
Значения в INI-файлах могут занимать несколько строк.
description = "Это многострочное\nзначение, которое\nиспользует escape-последовательности."$data = parse_ini_file('multiline.ini');
echo $data['description'];Это многострочное значение, которое использует escape-последовательности.
Синтаксис INI поддерживает массивы с помощью квадратных скобок.
files[] = file1.txt
files[] = file2.txt
files[] = file3.txtprint_r(parse_ini_file('arrays.ini'));Array
(
[files] => Array
(
[0] => file1.txt
[1] => file2.txt
[2] => file3.txt
)
)Пример чтения файла с секциями и сохранением типов данных.
[settings]
enabled = true
port = 8080
pi = 3.14159$data = parse_ini_file('typed.ini', true, INI_SCANNER_TYPED);
var_dump($data['settings']);array(3) {
["enabled"]=>
bool(true)
["port"]=>
int(8080)
["pi"]=>
float(3.14159)
}Функцию можно использовать с переменными в имени файла.
$env = 'production';
$config = parse_ini_file("config.{$env}.ini");parse_ini_file эффективно работает с файлами большого размера, так как использует оптимизированные внутренние функции PHP.