Jimi Dini ([info]indeyets) wrote,

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

    Error

    Your reply will be screened

    Your IP address will be recorded 

  • 37 comments

[info]spb_nick

March 5 2007, 09:52:55 UTC 5 years ago

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

[info]indeyets

March 5 2007, 10:01:10 UTC 5 years ago

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

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

[info]spb_nick

March 5 2007, 10:23:20 UTC 5 years ago

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

[info]indeyets

5 years ago

[info]spb_nick

5 years ago

[info]daedmen

March 5 2007, 10:19:26 UTC 5 years ago

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

[info]indeyets

March 5 2007, 10:24:18 UTC 5 years ago

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

[info]gorynych

March 5 2007, 11:40:29 UTC 5 years ago

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

[info]indeyets

March 5 2007, 11:51:57 UTC 5 years ago

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

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

[info]minitoka

March 5 2007, 12:47:07 UTC 5 years ago

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

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

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

[info]minitoka

March 5 2007, 12:48:36 UTC 5 years ago

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

[info]indeyets

March 5 2007, 12:56:16 UTC 5 years ago

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

[info]gorynych

March 5 2007, 13:13:13 UTC 5 years ago

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

[info]minitoka

5 years ago

[info]gorynych

5 years ago

[info]gorynych

5 years ago

[info]gorynych

March 5 2007, 13:12:51 UTC 5 years ago

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

[info]levgem

March 5 2007, 14:42:50 UTC 5 years ago

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

[info]indeyets

March 5 2007, 15:14:15 UTC 5 years ago

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

[info]levgem

March 5 2007, 15:19:16 UTC 5 years ago

Да я шучу =)

[info]gorynych

March 5 2007, 15:34:48 UTC 5 years ago

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

[info]levgem

March 5 2007, 15:38:32 UTC 5 years ago

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

[info]gorynych

5 years ago

[info]indeyets

5 years ago

[info]minitoka

5 years ago

[info]levgem

5 years ago

[info]cgvictor

March 5 2007, 12:10:45 UTC 5 years ago

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

[info]madfire

March 5 2007, 19:19:28 UTC 5 years ago

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

[info]minitoka

March 5 2007, 12:50:15 UTC 5 years ago

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

[info]indeyets

March 5 2007, 12:58:09 UTC 5 years ago

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

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

[info]minitoka

March 6 2007, 10:41:26 UTC 5 years ago

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

Знакомо :-)

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

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

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

[info]stden

May 20 2008, 10:26:23 UTC 4 years ago

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

[info]indeyets

May 20 2008, 10:32:16 UTC 4 years ago

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

[info]stden

May 20 2008, 10:45:18 UTC 4 years ago

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

[info]indeyets

4 years ago

[info]stden

4 years ago

[info]indeyets

4 years ago

Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…