PHP-4 Эффективная работа


Первое знакомство с 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.

19.1. Первое знакомство с WDDX

Главное преимущество 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>

19.2. Функции WDDX-генератора и анализатора

Теперь давайте приступим к подробному обсуждению функций 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, анализирует ее и восстанавливает переменные, содержащиеся в ней. Возвращаемый результат может представлять собой строку, число или массив. Сложные структуры данных при восстановлении помещаются в ассоциативные массивы.

назад
далее

Сайт управляется системой uCoz