Самые быстрые настройки для PHP-скриптов

Как выбрать самый оптимальный и быстрый формат хранения настроек скрипта или веб-приложения. Конфиги должны быть легко читаемыми, легко модифицируемыми, легко переносимыми, и ... максимально быстрыми.

Так как серверные PHP-скрипты выполняются, бывает, много раз в секунду, скорость загрузки конфигов — достаточно важный параметр.

Сравнение различных вариантов хранения настроек для PHP-скриптов с точки зрения скорости их работы

метод/кол-во записей 10 100 1000
Файлы с сериализованными данными 0.011 0.041 0.309
JSON-файлы 0.015 0.057 0.495
INI-файлы 0.015 0.086 0.784
PHP-скрипты 0.029 0.111 0.902
Текстовые файлы 2 0.036 0.250 2.213
Текстовые файлы 0.034 0.250 2.369
PHP-скрипты с define'ами 0.045 0.252 2.404
XML-файлы 2 0.047 0.276 2.791
XML-файлы 0.062 0.385 3.911

Самый быстрые в порядке убывания

  1. Файлы с сериализованными данными
  2. JSON-файлы
  3. INI-файлы
  4. PHP-скрипты
  5. Текстовые файлы
  6. Текстовые файлы 2
  7. PHP-скрипты с define'ами
  8. XML-файлы 2
  9. XML-файлы
Условия:
Понятно, что со вторым из условий тестирования можно поспорить. Мне этот вариант показался оптимальным для хранения настроек в памяти во время работы скрипта, но в некоторых случаях он таковым не является. И, кстати, этому условию не удовлетворяют PHP-скрипты с define'ами, из-за чего они и были помечены «вне конкурса».

INI-файлы


Результаты: 0.015, 0.086, 0.784

Пример:
x1 = 1
x2 = 2
x3 = 3

Скрипт:
function config($file) {
    return parse_ini_file($file);
}

Конфигурационный файл с классическим, всем знакомым синтаксисом. Достаточно быстрый и удобный способ.

PHP-скрипты


Результаты: 0.029, 0.111, 0.902

Пример: 
<?
return array (
  'x1' => '1',
  'x2' => '2',
  'x3' => '3',
);
?>

Скрипт:
function config($file) {
    return include($file);
}

Сначала маленькая оговорка. Во многих проектах конфигурационный файл не делает return, а просто определяет элементы глобального массива настроек. Это, с одной стороны, не совсем подходило под условия теста, а с другой стороны не совсем идеологически корректно в рамках борьбы против глобальных переменных. Поэтому для сравнения был использован предложенный вариант.

Обратите внимание на то, что этот вариант стабильно проигрывает INI-файлам, хоть и не очень значительно. Что ж, это компенсируется тем, что в настройках можно использовать PHP-выражения, что позволяет сделать конфиги максимально гибкими.

XML-файлы


Результаты: 0.062, 0.385, 3.911

Пример: 
<root>
  <x1>1</x1>
  <x2>2</x2>
  <x3>3</x3>
</root>

Скрипт:
function config($file) {
    $r = array();
    $dom = new DOMDocument;
    $dom->load($file);
    foreach ($dom->firstChild->childNodes as $node) {
        if ($node->nodeType == XML_ELEMENT_NODE) {
            $r[$node->nodeName] = $node->firstChild->nodeValue;
        }
    }
    return $r;
}

Недостаток очевидный: очень маленькая скорость работы, в несколько раз медленнее, чем другие варианты. Чтобы проверить, не слишком ли медленная PHP-часть этого кода, я попробовал сделать return сразу после загрузки XML-документа (то есть, фактически, конфигурационные параметры не возвращались). Это ускорило процесс всего приблизительно в два раза. Что подтвердило общий вывод.

Результаты: NEW! 0.047, 0.276, 2.791

Скрипт: NEW!
function config($file) {
    $r = array();
    foreach(simplexml_load_file($file) as $k => $v) {
        $r[$key] = strval($v);
    }
    return $r;
}

С помощью SimpleXML получается, конечно, быстрее. Но не настолько, чтобы претендовать на лидерство.
function config($file) { $xml = simplexml_load_file($file); $array = array(); foreach($xml as $key => $value) { $array[$key] = (string)$value; } return $array; } 

Текстовые файлы


Результаты: 0.034, 0.250, 2.369

Пример:
x1  1
x2  2
x3  3

Скрипт:
function config($file) {
    $r = array();
    if ($F =