?

Log in

YAML, PHP, Syck

« previous entry | next entry »
Mar. 5th, 2007 | 11:24 am

Если вы читаете мой англоязычный блог, то вы уже в курсе и можете дальше не читать

Позанимаюсь немножко саморекламой :)

На этих выходных я переписал php-биндинг к библиотеке Syck, которая позволяет очень быстро и главное в соответствии со спецификацией парсить YAML-документы. Рост скорости по сравнению с реализацией написаной на PHP приблизительно в 1000 раз. Этот биндинг автоматически распознаётся фреймворком Symfony, так что если вы пишете на нём, то этот extension вам будет особенно полезен.

Изменения по сравнению со старой версией syck extension:

  • Вместо падения в сегфолт на ошибках парсинга теперь кидается SyckException (наследуется от стандартного UnexpectedValueException -> RuntimeException)
  • Исправлены проблемы с компиляцией, о которых я знал (теперь безболезненно собирается на MacOS-X и при включенном ZTS)
  • В phpinfo() рапортуются версии библиотеки и биндинга
  • Поддерживается PHP5+

Релиз с этими изменениями автор обещал сделать в течение месяца, а пока можно брать исходники из subversion


Что такое YAML и зачем он нужен

YAML — это кроссплатформенный формат сериализации массивов и хэшей произвольной вложенности (с поддержкой указателей на другие массивы описанные в этом же документе). Основной элемент форматирования: отступ в 2 пробела.

---
# Пример синтаксиса (это комментарий)
array:
  - "element1" # это строка
  - element2 # это тоже строка
  - 0.5
  - null # это null, а не строка
  - true # а это булево значение

hash:
  key: value # пара ключ-значение
  key2: [ elt1, 100, elt3 ] # а тут в качестве значения используется inline-массив
  key3: { a: b, c: d, e: "some other value" } # а это inline-хэш
  texts: # а это вложенный хэш с двумя элементами
    sometext: >
      А это произвольный многострочный текст, в
      котором переносы строк на выходе будут
      заменены на пробелами
    somesource: |
      <?php
        // А это тоже текст, но на этот раз переносы строк будут сохранены
        $string = file_get_contents('test.yml');
        $array = syck_load($string);
        var_dump($array);
      ?>

Я использую YAML в основном для хранения файлов конфигурации, но на практике могут быть очень разные применения. Например Release-notes библиотеки Syck выполнены именно в виде YAML-файла. Читается на удивление легко, вы не находите? Сравните с XML :)

Материалы по теме:

Link | Leave a comment | Share

Comments {37}

Nick, The Fairily Squared

(no subject)

from: spb_nick
date: Mar. 5th, 2007 09:52 am (UTC)
Link

Сейчас использую еще более легкий формат - ClearSilver HDF :)
Ну и вообще, ClearSilver весьма лёгок, хоть код и надо бы почистить :)

Reply | Thread

Jimi Dini

(no subject)

from: indeyets
date: Mar. 5th, 2007 10:01 am (UTC)
Link

почитал
что-то не возникает у меня однозначного ощущения, что hdf мне нравится больше
по сути очень похоже, на самом деле :)

что не нравится: нет поддержки массивов (только хэши), обязательно использование скобок, нет типизации значений

Reply | Parent | Thread

Nick, The Fairily Squared

(no subject)

from: spb_nick
date: Mar. 5th, 2007 10:23 am (UTC)
Link

Да, конечно, зато он быстрее парсится :) Для встроенных применений это важно.
А массив, понятное дело, имитируется хэшем по индексу, плюс сортировка с произвольной функцией сравнения.

Reply | Parent | Thread

Jimi Dini

(no subject)

from: indeyets
date: Mar. 5th, 2007 10:30 am (UTC)
Link

мне кажется скорость парсинга будет сопоставимой… ты больше времени потеряешь на ручном приведении типов

Reply | Parent | Thread

Nick, The Fairily Squared

(no subject)

from: spb_nick
date: Mar. 5th, 2007 10:42 am (UTC)
Link

Зависит от применения :) В моем случае кроме строк ничего пока не пригодилось :)

Reply | Parent | Thread

daedmen

(no subject)

from: daedmen
date: Mar. 5th, 2007 10:19 am (UTC)
Link

спасибки, действительно удобно для конфигов, буду юзать..

Reply | Thread

Jimi Dini

(no subject)

from: indeyets
date: Mar. 5th, 2007 10:24 am (UTC)
Link

рад стараться :)

Reply | Parent | Thread

Dmitry Goryainov, "Gorynych"

(no subject)

from: gorynych
date: Mar. 5th, 2007 11:40 am (UTC)
Link

YAML мне mderk показывал, а вопрос на засыпку - почему не использовать как формат обмена данными JSON?

Reply | Thread

Jimi Dini

(no subject)

from: indeyets
date: Mar. 5th, 2007 11:51 am (UTC)
Link

на самом деле YAML и JSON почти близнецы-братья
http://ajaxian.com/archives/json-yaml-its-getting-closer-to-truth

но по мне так YAML более выразителен

Reply | Parent | Thread

(no subject)

from: minitoka
date: Mar. 5th, 2007 12:47 pm (UTC)
Link

А ты попробуй опиши одну и ту же структуру на YAML и JSON, Дима. :-)

JSON содержит больше паразитных символов (например, закрывающие скобки литералов, запятые даже в многострочных перечислениях).

Ну и до кучи — вчера пробовал разобрать встроенной в php функцией простую казалось бы структуру… Очень много ограничений.

Reply | Parent | Thread

(no subject)

from: minitoka
date: Mar. 5th, 2007 12:48 pm (UTC)
Link

Я невнимателен. Все, что я написал, касается конечно же использования YAML в качестве конфига. Пардон, если что.

Reply | Parent | Thread

Jimi Dini

(no subject)

from: indeyets
date: Mar. 5th, 2007 12:56 pm (UTC)
Link

вот тут ты меня совсем запутал. может переформулируешь? :)

Reply | Parent | Thread

Dmitry Goryainov, "Gorynych"

(no subject)

from: gorynych
date: Mar. 5th, 2007 01:13 pm (UTC)
Link

примерно с точностью до наоборот :-)

Reply | Parent | Thread

(no subject)

from: minitoka
date: Mar. 6th, 2007 10:37 am (UTC)
Link

Не успел вчера ответить, парни.

Я говорил о том, что для конфигов — да, YAML хорош, потому что читается. Немного мешают дефисы в начале строк. Мешают тем, что заставляют думать о том, в какую структуру данных отобразится конфиг. В то же время, задача хорошего конфигуратора как раз в абстрагировании.

Ну а про JSON я прогнал, потому что подумал, что Дима предложил его использовать для конфига. Это потом уже стоп-кран сработал и я прочитал слова „для передачи данных“. :-)

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

Reply | Parent | Thread

Dmitry Goryainov, "Gorynych"

(no subject)

from: gorynych
date: Mar. 6th, 2007 10:49 am (UTC)
Link

не-не-не! Я не про конфиги, я про обмен данными :-)

Reply | Parent | Thread

Dmitry Goryainov, "Gorynych"

(no subject)

from: gorynych
date: Mar. 6th, 2007 10:55 am (UTC)
Link

...просто конфиги, на мой взгляд, вполне частный случай и их можно так же сериализировать. С точки зрения обмена данными JSON кажется мне эффективнее, а смысла выделять конфигурационные файлы в отдельное, ради большей наглядности я не вижу. Проще написать конвертор JSON <=> человеко-понятный вид :-)

Reply | Parent | Thread

Dmitry Goryainov, "Gorynych"

(no subject)

from: gorynych
date: Mar. 5th, 2007 01:12 pm (UTC)
Link

ничего-ничего, бывает :-) Хотя и читал пришедший на мыло первый комментарий с некоторым удивлением, потому что YAML мне как раз и кажется более избыточным по описанию (хотя и более читаемым, но вот вопрос, что на самом деле важнее :-)

Reply | Parent | Thread

Макс Лапшин

(no subject)

from: levgem
date: Mar. 5th, 2007 02:42 pm (UTC)
Link

Потому что он используется в рельсах =)

Reply | Parent | Thread

Jimi Dini

(no subject)

from: indeyets
date: Mar. 5th, 2007 03:14 pm (UTC)
Link

ну тебя! :)
я его не только в рельсоподобных штуках использую :)

Reply | Parent | Thread

Макс Лапшин

(no subject)

from: levgem
date: Mar. 5th, 2007 03:19 pm (UTC)
Link

Да я шучу =)

Reply | Parent | Thread

Dmitry Goryainov, "Gorynych"

(no subject)

from: gorynych
date: Mar. 5th, 2007 03:34 pm (UTC)
Link

кто "он используется в рельсах"?

Reply | Parent | Thread

Макс Лапшин

(no subject)

from: levgem
date: Mar. 5th, 2007 03:38 pm (UTC)
Link

YAML. Насколько я понимаю, именно они начали популяризировать этот формат.

Reply | Parent | Thread

Dmitry Goryainov, "Gorynych"

(no subject)

from: gorynych
date: Mar. 5th, 2007 03:42 pm (UTC)
Link

вроде да, но в ответ на это можно сказать, что JSON популяризирует Yahoo. А так как Расмус работает в Yahoo, то это в большей степени ориентир для тех, кто пишет на PHP чем 37-ми сигнальные рельсы :-)

Reply | Parent | Thread

Jimi Dini

(no subject)

from: indeyets
date: Mar. 5th, 2007 03:47 pm (UTC)
Link

совершенна неправильна позиция противостояния для этих форматов.
json — вещь довольно узкая. он хорошо подходит для работы с JS т.к. обрабатывается там простым eval
а yaml удобнее когда задачи шире

насколько я понимаю, в json, например нет аналога merge'й
http://redhanded.hobix.com/bits/yamlSMergeKey.html

Reply | Parent | Thread

(no subject)

from: minitoka
date: Mar. 6th, 2007 10:38 am (UTC)
Link

Да и со ссылками внутри структуры (на момент декларации) там беда.

Reply | Parent | Thread

Макс Лапшин

(no subject)

from: levgem
date: Mar. 5th, 2007 03:48 pm (UTC)
Link

Ну ситуация такая, что тем, кто сейчас активно пишет фреймворки на PHP на Расмуса положить большой болт, а смотрят они исключительно на старшего брата =)

А вообще, JSON практически родной формат для питона.

Reply | Parent | Thread

CG

(no subject)

from: cgvictor
date: Mar. 5th, 2007 12:10 pm (UTC)
Link

Знаком. Но пока занял выжидательную позицию.

Reply | Thread

Мэдыч Фаерыч

(no subject)

from: madfire
date: Mar. 5th, 2007 07:19 pm (UTC)
Link

Чего выжидаешь, если не секрет?

Reply | Parent | Thread

(no subject)

from: minitoka
date: Mar. 5th, 2007 12:50 pm (UTC)
Link

Ксnати, Алекс, SPYC, насколько я понял, многих вещей из стандарта YAML не поддерживает. Были какие-то попытки его до- или переписать?

Reply | Thread

Jimi Dini

(no subject)

from: indeyets
date: Mar. 5th, 2007 12:58 pm (UTC)
Link

spyc туп до безобразия
дописывать его точно не хочется (я его только выправил чтобы E_NOTICE не кидались в 5.2)
а переписать наверное можно, но как-то нет стимула

у меня все намечающиеся проекты предполагают свободное руление сервером и в таком случае неясно нафига, если есть Syck :)

Reply | Parent | Thread

(no subject)

from: minitoka
date: Mar. 6th, 2007 10:41 am (UTC)
Link

> я его только выправил чтобы E_NOTICE не кидались в 5.2

Знакомо :-)

> а переписать наверное можно, но как-то нет стимула
> у меня все намечающиеся проекты предполагают свободное руление сервером и в таком случае неясно нафига, если есть Syck :)

Я спросил именно потому, что у меня далеко не все проекты работают в свободном окружении. Часть из них вообще на shared хостингах, представь…

Вот поэтому сижу, читаю спецификацию YAML, радуюсь.

Reply | Parent | Thread

Денис Степулёнок

(no subject)

from: stden
date: May. 20th, 2008 10:26 am (UTC)
Link

Я вот выбирают сейчас формат обмена данными для программы. Серверная часть программы будет на PHP, клиентская - на Java.
Пока склоняюсь в сторону JSON.
http://code.google.com/p/cs-javaphp/

Reply | Thread

Jimi Dini

(no subject)

from: indeyets
date: May. 20th, 2008 10:32 am (UTC)
Link

принципиальная разница YAML и JSON — типизация
JSON всё интерпретирует как строку
YAML позволяет явно идентифицировать тип объекта (как простой: число/булево/дата, так и сложный: класс)

Reply | Parent | Thread

Денис Степулёнок

(no subject)

from: stden
date: May. 20th, 2008 10:45 am (UTC)
Link

"...явно идентифицировать тип объекта..."
Прочитал http://ru.wikipedia.org/wiki/YAML - там ни слова о типах...???..

Reply | Parent | Thread

Jimi Dini

(no subject)

from: indeyets
date: May. 20th, 2008 10:50 am (UTC)
Link

там мало написано.
почитайте лучше официальную спецификацию на http://yaml.org/

Reply | Parent | Thread

Денис Степулёнок

(no subject)

from: stden
date: May. 20th, 2008 11:00 am (UTC)
Link

Читаю http://yaml.org/spec/1.2/#id2560236 ..
"1.4. Relation to JSON"
...
"every JSON file is also a valid YAML file"

Т.е. я могу сначала написать всю работу с JSON, а затем перейти на YAML, когда станет "не хватать" JSON... так?

Reply | Parent | Thread

Jimi Dini

(no subject)

from: indeyets
date: May. 20th, 2008 11:13 am (UTC)
Link

с небольшой оговоркой
"любой" json-файл стал валидным YAML-файлом начиная со спецификации 1.2

большая-же часть библиотек сейчас использует 1.1 или 1.0
через год, скорее всего, 1.2 будет поддерживаться хотя бы одной библиотекой для каждого языка

Reply | Parent | Thread