Расставляй правильно приоритеты и не отвлекайся на мелочи

PHP и YAML

По следам публикации: PHP, Meet YAML

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

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

Что такое YAML

Самый популярный конфигурационный формат для PHP приложений, только если мы не говорим о хранении всей конфигурации в базе данных, это INI и XML. Большинство из нас понимает эти форматы, но у каждого из них есть свои слабые стороны: INI невозможно представить в сложной иерархической форме, а XML не так прост в понимании и использовании, как INI.

В погоне за простотой и гибкостью, сообщество Ruby and Rails предлагает формат YAML (Yet Another Markup Language, произносится как "ямл" ("yaamel")), который включает в себя гибкость XML и простоту INI. Похоже, до создателей XML уже начинает доходить, что если программисты http://www.xmlsuck.com/ и создают http://www.yaml.org/, то, наверное, у XML формата и правда есть недостатки, не позволяющие ему быть действительно универсальным. (hb: взято из wiki)

Посмотрим сразу на комплексный пример счет-фактуры на YAML (последовательность элементов обозначается через тире, а ключевые пары, переменная и ее значение, разделяются двоеточием):


--- !clarkevans.com/^invoice

invoice: 34843

date   : 2001-01-23

bill-to: &id001

    given  : Chris

    family : Dumars

    address:

        lines: |

            458 Walkman Dr.

            Suite #292

        city    : Royal Oak

        state   : MI

        postal  : 48046

ship-to: *id001

product:

    - sku         : BL394D

      quantity    : 4

      description : Basketball

      price       : 450.00

    - sku         : BL4438H

      quantity    : 1

      description : Super Hoop

      price       : 2392.00

tax  : 251.42

total: 4443.52

comments: >

    Late afternoon is best.

    Backup contact is Nancy

    Billsmer @ 338-4338.

На первый взгляд все очень лаконично, почти все понятно и нет практически никакой перегрузки лишней информацией (тэгами и т.п.). Вообще YAML позиционируют как формат для сериализации данных, хранения конфигураций, логов, интернет сообщений и фильтров. Если есть недопонимания, Вам помогут следующие ссылки:

сейчас же наша цель немного не та.

Как заставить PHP понимать YAML

Пока поддержка YAML не встроена в PHP, но существует несколько решений этого упущения:

  • Spyc - обычный PHP класс для поддержки YAML, есть версия как для PHP4, так и для PHP5. Быстро ставится, легко используется.
  • Pecl/syck - очень быстрый YAML парсер (написан на C), который портирован Алексеем Захлестиным из проекта Syck в PECL как PHP расширение (PHP extension). Последний релиз (0.9.2) требует не менее: PHP 5.2.1 и PEAR Installer 1.4.0. (.DLL PECL для Windows я не нашел, если есть острая необходимость, DLL придется компилировать самостоятельно).
    Расширение содержит две функции:
    - array syck_load(string str)
    - string syck_dump(mixed data)
  • Horde/Yaml - PEAR пакет для парсинга YAML файлов в PHP массивы, и обратной "выгрузки" PHP массивов в YAML формат. Базируется на вышеназванном Spyc. Родной PHP парсер пока еще не полностью поддерживает всю спецификацию YAML, но если доступно Pecl/syck расширение, использует для парсинга его. Требования для версии 1.0.0 не менее: PHP 5.1.0 и PEAR Installer 1.4.0b1.

Таким образом, на сегодняшний момент, наиболее универсальной связкой PHP+YAML является последний пакет: Horde/Yaml.

Инсталлируем Horde/Yaml

Если у Вас настроен и установлен PEAR и есть доступ в интернет, можно воспользоваться его "магическими" командами:

pear channel-discover pear.horde.org
pear install horde/yaml

а нет, так можно просто скачать пакет Horde/Yaml, разархивировать его, и скопировать все содержимое директории Horde в доступную папку, указанную в include_path вашего PHP.

Используем Yaml

Вот простейший пример использования Horde/Yaml:

<?

function sample_autoloader($class) {

    require 
str_replace('_''/'$class) . '.php';

}

spl_autoload_register('sample_autoloader');

$a Horde_Yaml::load("foo: bar
baz: qux"
);

 

var_export($a);

echo 
"

";

echo 
Horde_Yaml::dump($a);

?>

А это его результат:

array (

  'foo' => 'bar',

  'baz' => 'qux',

)

---

foo: bar

baz: qux

Кроме вышеисполненных методов у Horde/Yaml есть еще два метода:
- loadFile(filename) - загружает Yaml содержимое из файла и
- loadStream(stream) - загружает Yaml содержимое из потока

На этом все, удачи, в освоении и применении Yaml!

5 комментариев на статью:
Ответить для keyser-sooze