Первое знакомство с WDDX
Функции WDDX-генератора и анализатора
Генерация системного журнала в XML+WDDX
Одна из весьма серьезных проблем, возникающих при web-программировании, заключается в необходимости стыковки между различными задачами (программами), объединяемыми в Интернет/Интранет-систему. Например, при разработке сложных систем, которые ведутся в несколько этапов различными командами разработчиков, может возникнуть ситуация, при которой часть модулей
реализована на Perl, а часть — на РНР. Одно из решений возникающих в такой
ситуации многочисленных проблем, которое было предложено фирмой Allaire-разработчиком известной инструментальной системы Cold Fusion основано на формате XML. WDDX1 является производным от XML и представляет собой достаточно удобный механизм, позволяющий конвертировать структуры данных из Perl,
Javascript или РНР в некоторый формат на базе XML или обратно.
совет
В отличие от пакета Cold Fusion WDDX выпущен как проект с открытым кодом. Вы можете загрузить WDDX SDK с сервера http://www.openwddx.org/. А при необходимости обес-
печить работу с WDDX из программ на Perl воспользуйтесь модулем WDDX.pm с CPAN.
Главное преимущество WDDX заключается в прозрачной для программиста поддержке не только разнообразных «элементарных» типов данных: строк, чисел, логических значений, даты и времени, но и составных — массивов, структур и записей. Кроме того, WDDX позволяет представлять и двоичные данные, например
графические изображения. Естественно, поддерживаются как вывод, так и ввод
данных.
После перезагрузки WWW-сервера с поддержкой WDDX мы можем приступить
к изучению возможностей этого протокола. Вначале попробуем сериализировать
(преобразовать в формат, пригодный для обмена) одно отдельное значение. Хитрость WDDX, которая находит отражение в терминологии, состоит в том, что исходные данные преобразуются в так называемые «пакеты данных», которые инкапсулируют имя переменной, ее тип и значение.
Таким образом, приведенная ниже программа:
<?php
print wddx_serialize_value("npeoбpaзовaниe PHP в WDDX",
"PHP пакет");
?>
приведет к формированию пакета (текстовой строки):
<wddxPacket version=' 1.0' xheader comment='PHP пакет'/><data>
<string>Преобразование PHP в WDDX</string></data></wddxPacket>
Итак, что мы видим. Сначала в поток помещен тег, представляющий собой идентификатор версии протокола WDDX. Версия 1.0 является единственной существующей, поэтому просто принимайте эту информацию к сведению. Затем следует
комментарий, в котором содержится либо описание переменной, либо (иногда)
помещается имя переменной, в которой хранились данные в исходной программе.
А уже затем следует тег (в данном случае <stri ng>), который определяет тип переменной и окружает ее значение.
ПРИМЕЧАНИЕ
Имейте в виду, что все функции PHP-машины, ориентированные на сериализацию дан-
ных, определяют категорию формируемого описания (массив или структура) по первому
элементу анализируемой структуры данных. Если первый элемент использует в качестве
ключа строку, то в процессе сериализации будет сформирована структура (собирается
в хэш-массив), а если число, то будет сформирован массив.
Но использовать WDDX для хранения отдельных, изолированных переменных
на практике не слишком удобно, поэтому в WDDX предусмотрен механизм «накопления» переменных, подлежащих сериализации, с последующим помещением
их «в один флакон». Вот как это выглядит на практике:
<?рhр
$pi = 3.1415926;
// Создаем пакет, в который будем сбрасывать данные
// Сразу же определяем его заголовок, в котором обычно помещается
// назначение и/или происхождение пакета
$packet_id = wddx_packet_start("PHP");
// добавляем первую переменную
wddx_add_vars($packet_id, "pi");
// А теперь определим массив $cities
$cities = array("Austin", "Novato", "Seattle");
// и тоже сбросим его в пакет
wddx_add_vars($packet_id, "cities");
// теперь закрываем (и формируем) пакет
$packet = wddx_packet_end($packet_id);
// это большая строка, в которой содержатся все
// помещенные в пакет переменные
print $packet;
?>
В результате выполнения этой программы вы получите следующий пакет WDDX:
<wddxPacket version='1.0'xheader comment='PHP'/>
<data>
<struct>
<var name='pi'><number>3.1415926</number>
</var>
<var name='ci ties'>
<array length='3'>
<string>Austin</string>
<string>Novato</string>
<string>Seattle</string>
</array>
</var>
</struct>
</data>
</wddxPacket>
Теперь давайте приступим к подробному обсуждению функций WDDX.
19.2.1. Сериализация переменной: wddx_serialize value
string wddx_serialize_value (mixed var [, string comment])
Функция wddx_serialize_value() используется для создания WDDX пакета,
содержащего одно-единственное значение. Это значение извлекается из переменной var, а при наличии необязательного комментария comment он добавляется
в заголовок пакета. Результатом работы функции является сформированный
WDDX-пакет.
19.2.2. Сериализация множества: wddx_serialize_vars
string wddx_serialize_vars (mixed var_name [, mixed ...])
Функция wddx_serialize_vars() предназначена для создания пакета WDDX,
в котором содержится структура с сериализованным представлением множества
переменных, переданных в качестве аргументов функции.
Функция принимает переменное количество аргументов, каждый из которых может представлять собой либо строку, значение которой является именем переменной, подлежащей помещению в пакет, либо массив, элементы которого являются
именами переменных или массивов, которые содержат такие имена, и т. д. В общем, рекурсивные возможности функции, на которые несомненное влияние оказал Лисп, предоставляют широкий простор для деятельности.
Вот как эта функция может использоваться на практике:
<?рhр
$а = 1;
$b = 5.5;
$с = array("blue", "orange", "violet");
$d = "colors";
$clvars = array("c", "d");
print wddx_serialize_vars("a", "b", $clvars);
?>
В результате выполнения этого примера будет сформирован следующий пакет
WDDX:
<wddxPacket version='1.0'>
<header/>
<data>
<struct>
<var name='a'>
<number>l</number>
</var>
<var name='b'>
<number>5.5</number>
</var>
<var name='c'>
<array length='3'>
<string>blue</string>
<stning>orange </string>
<string>violet</string>
</array>
</var>
<var name='d'>
<string>colors</string>
</var>
</struct>
</data>
</wddxPacket>
19.2.3. Создание нового пакета: wddx_packet_start
int wddx_packet_start ([string comment])
Функция wddx_packet_start () используется для создания нового пакета WDDX,
предназначенного для накопления в нем нескольких переменных. Функция может принимать дополнительный аргумент comment, в который помещается необязательный комментарий (описание пакета). По завершению работы функция возвращает целочисленный идентификатор пакета, который используется при работе
функций заполнения. Определение всех структур данных, необходимых для хранения помещаемых в пакет переменных, будет выполняться автоматически.
19.2.4. Закрытие пакета: wddx_packet_end
string wddx_packet_end (int packet_id)
Функция wddx_packet_end() завершает обработку пакета WDDX, идентифици-
руемого с помощью packet_id, и возвращает строку, содержащую сформированный пакет.
19.2.5. Добавление данных в пакет: wddx_add_vars
wddx_add_vars (int packet_id, mixed name_var [, mixed ...])
Функция wddx_add_va rs () используется для сериализации переданных ей аргументов с помещением в открытый ранее пакет с идентификатором id. Переменные, которые подлежат сериализации, определяются так же, как и в функции
wddx_serialize_vars() (см. раздел 19.2.2).
19.2.6. Восстановление данных: wddx deserialize
mixed wddx_deserialize (string packet)
Функция wddx_deserialize() принимает в качестве аргумента строку, содержащую пакет WDDX, анализирует ее и восстанавливает переменные, содержащиеся
в ней. Возвращаемый результат может представлять собой строку, число или массив. Сложные структуры данных при восстановлении помещаются в ассоциативные массивы.
|