Взаймодействие Flash и php

Взаймодействие Flash и php

Flash сегодня представляет собой вполне приемлемое решение для организации веб-приложений, использующих интенсивный обмен данными между сервером и клиентом.

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

Где это можно использовать? Собственно, там, где нужен обмен данными, но нет особой потребности в поисковой индексации страниц, там где требуется многократная выдача промежуточных данных, различающихся в зависимости от пользовательского ввода. И, конечно, там где требуется анимация или ее элементы. Типичный для сегодняшнего дня пример — онлайновая игрушка с ведением таблицы рекордов. Итак,

Дано:

Flash-приложение, которому требуется обмен данными с сервером. Требуется организовать способ передачи данных. Данными в этом простейшем примере выступит произвольная строка.

Решение:

Передать и принять данные в ActionScript можно разными способами. Один из самых старых и надежных — это использование объекта XML.

Когда мы говорим об XML, всегда подразумевается некоторая валидность документа. В случае Flash это тоже так, но в процессе обмена информацией с сервером, валидация не нужна. Практически любая последовательность символов может быть передана и принята.

Первый шаг — на основании строки создаем объект XML:

var my_str = "blabla";
var my_xml:XML = new XML(my_str);

Теперь вновь созданный объект XML несет в себе нашу полезную строковую информацию (несмотря на то, что она не является well-formed XML-документом). Её можно вывести на экран методом toString() объекта XML:

trace (my_xml.toString());

Шаг второй: задаем contentType:

my_xml.contentType = "text/xml";

Было много дискуссий насчет того, надо или не надо это делать. Я не хочу вдаваться в механизмы работы объекта XML во Flash. Для меня это свойство — гарантия того, что содержимое XML при отправке его на сервер, будет размещено в области RAW POST DATA (сырых, неразобранных POST-данных), откуда мы их сможем легко извлечь в php-скрипте.

Шаг третий: готовим обработчик получения результата

Как правило, нас мало интересует просто отправка данных, мы хотим быть уверены, что они приняты, обработаны и получен результат. Для этого php должен отправить что-то в ответ, а Flash должен его получить. Получать данные от сервера будет опять-таки объект XML. Вообще, это может быть любой XML ролика, в том числе и тот, который отправлял данные. Ему мы назначим обработчик полученного результата. Для простоты он будет трассировать полученные данные:

var receive_xml:XML = new XML();
recrive_xml.onLoad = function(success){
if(success){
trace(this.toString());
} else {
trace("данные получить не удалось");
}
}

Шаг последний: отправляем данные и ждем результат

Для этого воспользуемся методом sendAndLoad(). В качестве параметров он принимает название файла, который планируется загружать и объект, в который будут загружены полученные данные. Поскольку задача стоит в передаче данных в php, имя этого скрипта и будет в качестве файла, а объект приема данных уже готов:

my_xml.sendAndLoad("phpscript.php", receive_xml);

Теперь дело за серверной частью. Мы должны создать Скрипт, который смог бы прочесть отправленные данные и выдать ответ. В php есть несколько способов получить RAW POST данные. Один из вариантов — использование Stream-ов (для этого нам нужен php версии не ниже 4.3). RAW POST DATA в этом случае читаются функцией file_get_contents("php://input"). Далее мы организуем простой вывод какой-нибудь маркерной фразы, чтобы убедиться, что скрипт работает. В реальном приложении будет происходить обработка полученных даных, и все прочие штуки, на которые способен php и программист. В примере все проще:

<?php
// получаем данные...
$input = file_get_contents("php://input");

// ... что-то с ними делаем ...

// ... и выдаем результат
echo "Привет из php. Вы нам писали:".$input;
?>

Важное замечание: Flash работает с кодировкой UTF-8. Поэтому, чтобы не было проблем, php файл тоже должен быть в этой кодировке. Если по каким-то причинам это невозможно, все выходные данные должны быть перекодированы в UTF-8. Хороший способ для этого — функция iconv().

Пробовать подобный пример тут.

Итого:

В статье описаны ключевые моменты взаимодействия Flash и сервера. Разумеется, что способ решения этой задачи не один. Я использую этот вариант потому, что XML дает дополнительный инструментарий обработки переданных и принятых данных. Чего стоит, к примеру, только возможности, которые предоставляет класс XPath от xfactorstudio! На стороне сервера масса средств для работы с XML при использовании php5 и набора функций DOM.

Комментарии (39)

mem: 1081 total: 10 module: 5 xsl: 3