Jimi Dini ([info]indeyets) wrote,
@ 2007-03-05 11:24:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
YAML, PHP, Syck

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

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

На этих выходных я переписал 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 :)

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




(Post a new comment)


[info]spb_nick
2007-03-05 09:52 am UTC (link)
Сейчас использую еще более легкий формат - ClearSilver HDF :)
Ну и вообще, ClearSilver весьма лёгок, хоть код и надо бы почистить :)

(Reply to this) (Thread)


[info]indeyets
2007-03-05 10:01 am UTC (link)
почитал
что-то не возникает у меня однозначного ощущения, что hdf мне нравится больше
по сути очень похоже, на самом деле :)

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

(Reply to this) (Parent)(Thread)


[info]spb_nick
2007-03-05 10:23 am UTC (link)
Да, конечно, зато он быстрее парсится :) Для встроенных применений это важно.
А массив, понятное дело, имитируется хэшем по индексу, плюс сортировка с произвольной функцией сравнения.

(Reply to this) (Parent)(Thread)


[info]indeyets
2007-03-05 10:30 am UTC (link)
мне кажется скорость парсинга будет сопоставимой… ты больше времени потеряешь на ручном приведении типов

(Reply to this) (Parent)(Thread)


[info]spb_nick
2007-03-05 10:42 am UTC (link)
Зависит от применения :) В моем случае кроме строк ничего пока не пригодилось :)

(Reply to this) (Parent)


[info]daedmen
2007-03-05 10:19 am UTC (link)
спасибки, действительно удобно для конфигов, буду юзать..

(Reply to this) (Thread)


[info]indeyets
2007-03-05 10:24 am UTC (link)
рад стараться :)

(Reply to this) (Parent)


[info]gorynych
2007-03-05 11:40 am UTC (link)
YAML мне [info]mderk показывал, а вопрос на засыпку - почему не использовать как формат обмена данными JSON?

(Reply to this) (Thread)


[info]indeyets
2007-03-05 11:51 am UTC (link)
на самом деле YAML и JSON почти близнецы-братья
http://ajaxian.com/archives/json-yaml-its-getting-closer-to-truth

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

(Reply to this) (Parent)


[info]minitoka
2007-03-05 12:47 pm UTC (link)
А ты попробуй опиши одну и ту же структуру на YAML и JSON, Дима. :-)

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

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

(Reply to this) (Parent)


[info]minitoka
2007-03-05 12:48 pm UTC (link)
Я невнимателен. Все, что я написал, касается конечно же использования YAML в качестве конфига. Пардон, если что.

(Reply to this) (Parent)(Thread)


[info]indeyets
2007-03-05 12:56 pm UTC (link)
вот тут ты меня совсем запутал. может переформулируешь? :)

(Reply to this) (Parent)(Thread)


[info]gorynych
2007-03-05 01:13 pm UTC (link)
примерно с точностью до наоборот :-)

(Reply to this) (Parent)(Thread)


[info]minitoka
2007-03-06 10:37 am UTC (link)
Не успел вчера ответить, парни.

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

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

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

(Reply to this) (Parent)(Thread)


[info]gorynych
2007-03-06 10:49 am UTC (link)
не-не-не! Я не про конфиги, я про обмен данными :-)

(Reply to this) (Parent)(Thread)


[info]gorynych
2007-03-06 10:55 am UTC (link)
...просто конфиги, на мой взгляд, вполне частный случай и их можно так же сериализировать. С точки зрения обмена данными JSON кажется мне эффективнее, а смысла выделять конфигурационные файлы в отдельное, ради большей наглядности я не вижу. Проще написать конвертор JSON <=> человеко-понятный вид :-)

(Reply to this) (Parent)


[info]gorynych
2007-03-05 01:12 pm UTC (link)
ничего-ничего, бывает :-) Хотя и читал пришедший на мыло первый комментарий с некоторым удивлением, потому что YAML мне как раз и кажется более избыточным по описанию (хотя и более читаемым, но вот вопрос, что на самом деле важнее :-)

(Reply to this) (Parent)


[info]levgem
2007-03-05 02:42 pm UTC (link)
Потому что он используется в рельсах =)

(Reply to this) (Parent)(Thread)


[info]indeyets
2007-03-05 03:14 pm UTC (link)
ну тебя! :)
я его не только в рельсоподобных штуках использую :)

(Reply to this) (Parent)(Thread)


[info]levgem
2007-03-05 03:19 pm UTC (link)
Да я шучу =)

(Reply to this) (Parent)


[info]gorynych
2007-03-05 03:34 pm UTC (link)
кто "он используется в рельсах"?

(Reply to this) (Parent)(Thread)


[info]levgem
2007-03-05 03:38 pm UTC (link)
YAML. Насколько я понимаю, именно они начали популяризировать этот формат.

(Reply to this) (Parent)(Thread)


[info]gorynych
2007-03-05 03:42 pm UTC (link)
вроде да, но в ответ на это можно сказать, что JSON популяризирует Yahoo. А так как Расмус работает в Yahoo, то это в большей степени ориентир для тех, кто пишет на PHP чем 37-ми сигнальные рельсы :-)

(Reply to this) (Parent)(Thread)


[info]indeyets
2007-03-05 03:47 pm UTC (link)
совершенна неправильна позиция противостояния для этих форматов.
json — вещь довольно узкая. он хорошо подходит для работы с JS т.к. обрабатывается там простым eval
а yaml удобнее когда задачи шире

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

(Reply to this) (Parent)(Thread)


[info]minitoka
2007-03-06 10:38 am UTC (link)
Да и со ссылками внутри структуры (на момент декларации) там беда.

(Reply to this) (Parent)


[info]levgem
2007-03-05 03:48 pm UTC (link)
Ну ситуация такая, что тем, кто сейчас активно пишет фреймворки на PHP на Расмуса положить большой болт, а смотрят они исключительно на старшего брата =)

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

(Reply to this) (Parent)


[info]cgvictor
2007-03-05 12:10 pm UTC (link)
Знаком. Но пока занял выжидательную позицию.

(Reply to this) (Thread)


[info]madfire
2007-03-05 07:19 pm UTC (link)
Чего выжидаешь, если не секрет?

(Reply to this) (Parent)


[info]minitoka
2007-03-05 12:50 pm UTC (link)
Ксnати, Алекс, SPYC, насколько я понял, многих вещей из стандарта YAML не поддерживает. Были какие-то попытки его до- или переписать?

(Reply to this) (Thread)


[info]indeyets
2007-03-05 12:58 pm UTC (link)
spyc туп до безобразия
дописывать его точно не хочется (я его только выправил чтобы E_NOTICE не кидались в 5.2)
а переписать наверное можно, но как-то нет стимула

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

(Reply to this) (Parent)(Thread)


[info]minitoka
2007-03-06 10:41 am UTC (link)
> я его только выправил чтобы E_NOTICE не кидались в 5.2

Знакомо :-)

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

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

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

(Reply to this) (Parent)


[info]stden
2008-05-20 10:26 am UTC (link)
Я вот выбирают сейчас формат обмена данными для программы. Серверная часть программы будет на PHP, клиентская - на Java.
Пока склоняюсь в сторону JSON.
http://code.google.com/p/cs-javaphp/

(Reply to this) (Thread)


[info]indeyets
2008-05-20 10:32 am UTC (link)
принципиальная разница YAML и JSON — типизация
JSON всё интерпретирует как строку
YAML позволяет явно идентифицировать тип объекта (как простой: число/булево/дата, так и сложный: класс)

(Reply to this) (Parent)(Thread)


[info]stden
2008-05-20 10:45 am UTC (link)
"...явно идентифицировать тип объекта..."
Прочитал http://ru.wikipedia.org/wiki/YAML - там ни слова о типах...???..

(Reply to this) (Parent)(Thread)


[info]indeyets
2008-05-20 10:50 am UTC (link)
там мало написано.
почитайте лучше официальную спецификацию на http://yaml.org/

(Reply to this) (Parent)(Thread)


[info]stden
2008-05-20 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 to this) (Parent)(Thread)


[info]indeyets
2008-05-20 11:13 am UTC (link)
с небольшой оговоркой
"любой" json-файл стал валидным YAML-файлом начиная со спецификации 1.2

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

(Reply to this) (Parent)


Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…