Автор: Кирилл Карпенко
21 сентября 2006 года
Привет всем моим читателям!
Сегодня мы поговорим об очень важной технологии не только для мира Веб, но и для
программирования в целом. А поговорим мы сегодня про универсальность данных и
межплатформенный обмен информации. Как вы уже, наверное, поняли, для этого мы
будем использовать технологии WDDX.
Но что это такое,- спросите вы.
WDDX был разработан совместными усилиями разработчиков компании Alliery в 1998
году. И призвана она в сей мир для того лишь, чтобы унифицировать информацию, и
перевести её в один, доступный всем платформам формат- XML. И сказать честно у
них это получилось. Впервые технологию WDDX разработчики Alliery внедрили в свою
же платформу, а именно ColdFusion. С течением времени данный формат данных
набрал популярности среди разработчиков современного веб'а (хотя не так сильно,
как хотелось бы). Данная технология была внедрена в большинство языков для
веб-программирования. Так модули для поддержки WDDX доступны для Perl, PHP,
Python, ColdFusion и многих других.Сегодня мы поговорим об очень важной
технологии не только для мира Веб, но и для программирования в целом. А
поговорим мы сегодня про универсальность данных и межплатформенный обмен
информации. Как вы уже, наверное, поняли, для этого мы будем использовать
технологии WDDX.
Ну, поскольку данная статья посвящена именно WDDX для платформы РНР, то о РНР
сейчас и пойдёт речь.
В РНР данная технология интегрирована по умолчанию, и доступна во всех версиях
начиная с 3.x.
По большому счёту технология WDDX не такая уж и масштабная, и заключается в
нескольких банальных этапах обработки данных.
Вот эти этапы:
Данные
Сериализация и трансформация в WDDX код
Сериализирование данные
Десериализация и трансформация в ассоциативный массив
Данные
Как видите, с данных всё началось, и данными всё окончилось. Теперь давайте
поговорим подробнее о каждом из этапов.
Что ж, допустим у нас есть некоторая переменная произвольного типа, и нам нужно
перенести её в WDDX формат, для дальнейших трансформация. Для этого мы
производим сериализацию, а то есть перевод данных в WDDX. Однако мы передаём не
только данные и название ассоциированной с ними переменной, но и тип
ассоциированной переменной, так как зачем нам обыкновенные данные.
В данный момент WDDX поддерживает большинство из доступных на разных платформах
типов данных (числа, строки, структуры, массивы).
Что ж, чтобы вам было понятнее, мы сейчас напишем небольшой пример по
сериализации данных, для того чтобы показать структуру WDDX данных на примере.
<?php
$array=array('dasa','fgs','312ew');
$integer=312;
$string='fgasdfasf';
$pack=wddx_packet_start('First WDDX package');
wddx_add_vars($pack,'array','integer','string','float');
$serialized_data=wddx_packet_end($pack);
print htmlspecialchars($serialized_data);
?>
Что ж давайте по порядку. Сначала мы объявляем разного рода переменные, для того
чтобы сериализировать их в WDDX формат. После этого мы создаём "стартовый" пакет
WDDX.
Кстати, вы можете оставить некоторый произвольный комментарий в качестве
параметра функции wddx_packet_start(). Данный текст будет добавлен в специальный
XML-тег с индификатором <comment>.
В целом он не носит никакой практической пользы, кроме того, что поясняет
предназначение данных в данном WDDX пакете.
После того как мы создали пакет, у нас есть возможность добавлять в него новые
данные. Для этого мы вызываем функцию wddx_add_vars. Которая первым аргументом
принимает идентификатор пакета, а после n-е количество аргументов строкового
типа, которые будут носить название переменных в среде РНР. Эта же функция
производит процесс сериализации данных.
Теперь мы просто вызываем функцию wddx_packet_end, которой передаём ресурс
пакета, и возвращённый результат присваиваем переменной $serialized_data. Теперь
у нас есть готовый WDDX код, который можно отображать.
Для его отображения мы применяем к нему функцию htmlspecialchars, так как
браузер не будет корректно отображать "теговые" данные.
Вот, как видите ничего архисложно (как бы сказал дедушка Ленин) в этом нет.
Эти данные теперь можно успешно преобразовывать в данные на другой платформе, и
продолжать работу с ними. И вот сразу и появляеться вопрос, как же их
преобразовать обратно?
А очень просто, для этого есть процедура десериализации. Десериализация это как
раз процесс обратный сериализации, а именно перевод данных на ту или иную
платформу, в виде ассоциативного массива, где индексом будет название
переменной, а значением её содержимое. Для десериализации в РНР служит функция
wddx_deserialize или её прототип wddx_unserialize, дело в том, что функция
wddx_unserialize доступна лишь в поздних версиях языка РНР, и потому мы в данной
статье будем использовать функцию wddx_deserialize.
Что ж, давайте и это протестируем, для наглядности:
<?
$array=array('dasa','fgs','312ew');
$integer=312;
$string='fgasdfasf';
$pack=wddx_packet_start('First WDDX package');
wddx_add_vars($pack,'array','integer','string');
$serialized_data=wddx_packet_end($pack);
// Я удалю начальные переменные, чтобы показать вам, что они действительно
// пересоздадуться
unset($array,$integer,$float,$string);
$deserialized_data=wddx_deserialize($serialized_data);
foreach($deserialized_data as $k=>$v){
$$k=$v;
}
print $integer.';'.$array.';'.$string;
?>
Вот, как видите, всё успешно работает.
Сначала мы удаляем переменные (не забудьте - это не обязательно), а после
вызываем функцию wddx_deserialize и передаём ей сериализированые данные в
качестве аргумента, и результат её выполнения присваиваем переменной
$deserialized_data. Но нам ведь не нужен массив, и поэтому нам нужно перевести
его в формат обычных переменных. Для этого мы делаем простейший перебор и
вспоминая тонкости РНР присваиваем переменно, именем которой будет значение
переменной $k, значение переменной $v, так мы полностью восстанавливаем все
переменные.
Как видите, процесс работы с технологией WDDX довольно прост, однако для полного
усвоения материала, мы создадим небольшой проект, в соответствии, с которым мы
сначала сформируем WDDX-совместимые данные в среде ColdFusion с данные, скажем,
биржи акций, далее нашей задачей будет перевести данные в среду РНР, для
дальнейшей их обработки.
Что ж, приступим.
Код на PHP
<html>
<head>
<title>Биржа акций </title>
<meta http-eqiv='Content-Type' Content='text/html; charset=windows-1251'>
<meta name='Author' Content='LoRd aka K.Karpenko'>
</head>
<body>
<?php
if(isset($_POST['add'])){
$title=$_POST['title'];
$cost=$_POST['cost'];
$saldo=$_POST['saldo'];
$package=wddx_packet_start('Share Information System');
wddx_add_vars($package,'title','cost','saldo');
$serialized_data=wddx_packet_end($package);
$f=fopen('data.xml','w+');
flock($f,LOCK_EX);
fwrite($f,$serialized_data);
flock($f,LOCK_UN);
fclose($f);
print "Данные успешно добавлены!";
}
?>
<form action='' method='post'>
Название акций:<input type='text' name='title'><br>
Стоимость1000 акций: <input type='text' name='cost'><br>
Биржевое сальдо: <input type='text' name='saldo'>
<input type='submit' name='add' value='Добавить'>
</form>
</body>
</html>
Принцип вы скорее всего уже поняли. Полученные из формы данные мы сериализируем
в формат WDDX, а потом пишем их в некий файл data.xml, для последующей обработки
в среде ColdFusion, которая и будет обрабатывать данные файла.
Код на CFML
<html>
<head>
<title>Стоимость акций на бирже</title>
</head>
<body>
<cflock name='Block' type='ReadOnly' timeout='60'>
<cffile action='read' file='data.xml' variable='wddx_data'>
</cflock>
<cfwddx action='wddx2cfml' input='#wddx_data#' output='shares_cost'>
Данные по бирже:<br>
<cfoutput>
#shares_cost#
</cfotput>
</body>
</html>
Вот и всё, на этом мы заканчиваем рассмотрение технологии межплатформенного
обмена WDDX. Если у вас появятся вопросы по данной теме или вы столкнётесь с
проблемами во время использования технологии, обязательно пишите, и мы вместе
решим появившиеся проблемы.
До скорых встреч, Кирилл. |