?

Log in

No account? Create an account

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 | Expand

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 | Expand

Макс Лапшин

(no subject)

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

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

Reply | Parent | Thread | Expand

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 | Expand

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

(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 | Expand