Parse ini file: примеры (PHP)

Использование parse_ini_file для работы с конфигурацией
Раздел: Файлы конфигурации
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 упрощает управление конфигурацией без необходимости написания собственного парсера.

Аргументы функции

Функция принимает три параметра:

  1. $filename (string, обязательный) - Путь к INI-файлу.
  2. $process_sections (bool, необязательный, по умолчанию false) - Если установлено в true, функция возвращает многомерный массив с включением секций. Если false, возвращает плоский ассоциативный массив.
  3. $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() и обработки

Для нестандартных форматов можно использовать комбинацию file_get_contents() или file() с последующей обработкой строк. parse_ini_file предпочтительнее для стандартных INI-файлов.

Использование форматов JSON или YAML

Для сложных структур данных часто применяют 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']
JavaScript (Node.js)

Популярный пакет 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)
Некорректный синтаксис INI

Строки без знака равенства игнорируются, что может привести к неожиданным результатам.

; Файл error.ini
key_without_value
correct = value
print_r(parse_ini_file('error.ini'));
Array
(
    [correct] => value
)
Попытка использовать зарезервированные слова

Использование null, yes, no, true, false, on, off в качестве значений может привести к их преобразованию в логические значения в режиме INI_SCANNER_NORMAL.

Изменения в новых версиях PHP

PHP 5.6.1

Добавлена константа INI_SCANNER_TYPED для сохранения типов значений при разборе.

PHP 7.0

Добавлена поддержка escape-последовательностей в двойных кавычках. В более ранних версиях они не обрабатывались.

PHP 8.0

Изменений в поведении функции не было. Функция продолжает работать в соответствии с документацией предыдущих версий.

Расширенные примеры

Работа с многострочными значениями

Значения в INI-файлах могут занимать несколько строк.

Пример php
description = "Это многострочное\nзначение, которое\nиспользует escape-последовательности."
Пример php
$data = parse_ini_file('multiline.ini');
echo $data['description'];
Это многострочное
значение, которое
использует escape-последовательности.
Использование массивов в INI

Синтаксис INI поддерживает массивы с помощью квадратных скобок.

Пример php
files[] = file1.txt
files[] = file2.txt
files[] = file3.txt
Пример php
print_r(parse_ini_file('arrays.ini'));
Array
(
    [files] => Array
        (
            [0] => file1.txt
            [1] => file2.txt
            [2] => file3.txt
        )
)
Комбинирование секций и флагов

Пример чтения файла с секциями и сохранением типов данных.

Пример php
[settings]
enabled = true
port = 8080
pi = 3.14159
Пример php
$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)
}
Динамическое построение пути к файлу

Функцию можно использовать с переменными в имени файла.

Пример php
$env = 'production';
$config = parse_ini_file("config.{$env}.ini");
Обработка больших конфигурационных файлов

parse_ini_file эффективно работает с файлами большого размера, так как использует оптимизированные внутренние функции PHP.

PHP parse_ini_file function comments

En
Parse ini file Parse a configuration file