Flash и PHP

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

Оглавление:
  1. Дано:
  2. Решение:
  3. Заключение

В отличие от обычных страниц 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();
receive_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]<?php
// получаем данные…
$input = file_get_contents("php://input");
// … что-то с ними делаем …
// … и выдаем результат
echo "Привет из php. Вы нам писали:".$input;[/php]

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

К началу

Заключение

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

автор
htmlhook.ru | Скрипты для веб-приложений