Thứ Sáu, 4 tháng 12, 2009

How to Use Flash with PHP

Đây là bài viết chuẩn bị cho topic cùng tên trong PHPDAY .

Có rất nhiều cách giúp Flash client và PHP có thể giao tiếp được với nhau .

Về nguyên tắc flash client có thể sử dụng giao thức TCP/IP  ( và mới đây là Peer-to-Peer )  . Tuy nhiên thông dụng nhất vẫn là qua HTTP . Như vậy mọi mọi kết nối HTTP đều có thể dùng flash để giao tiếp ngon lành :D .

1. Dùng plain text

Tôi sẽ cố gắng load nội dung một file text trên i-php.net ( url của file : http://i-php.net/phpday/example.txt)

Ở đây  tôi minh họa bằng action script 3
var request:URLRequest = new URLRequest("http://i-php.net/phpday/example.txt");
var loader:URLLoader = new URLLoader(request);

// Handler when Loader complete
loader.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
trace("loaded content: " + loader.data);
}

// output  loaded content: Hello Flash client

Tất nhiên là flash client chẳng quan tâm đến file plain text ( ở đây là http://i-php.net/phpday/example.txt) là file tĩnh hay output của một server side process - server side script cả . Bạn có thể thay thế bằng việc gọi tới một file php script bằng cách thay URL .
var request:URLRequest = new URLRequest("http://i-php.net/about/");

Như vậy đối với flash việc đọc một file trên http server là dễ dàng . Từ việc đọc được một text file ta có thể dùng nhiều cách để giao tiếp với server ( load variable , Json, XML-RPC, SOAP , REST , ...)

2. Dùng load variable

Dùng kỹ thuật này đề load các dữ liệu có định dạng name=value .

Ở actionscript 2 thì chỉ cần gọi hàm loadVariables
Ở actionscript 3 ta sửa đoạn code trên .
var request:URLRequest = new URLRequest("http://i-php.net/phpday/loadme.php");
var loader:URLLoader = new URLLoader(request);
// format result as VARIABLES
loader.dataFormat = URLLoaderDataFormat.VARIABLES


// Handler when Loader complete
loader.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);

if(loader.data is URLVariables)
{
trace(loader.data.user+":"+loader.data.message);

}
}

File loadme.php chỉ đơn giản là echo ra nội dung :

echo 'message=Hello&user=system';
?>

Như vậy loadvar thực chất là định dạng nội dung theo định dang name=value pairs .

Với những dữ liệu đơn giản thì chỉ cần các cách 1 và 2 là đủ . Tuy nhiên với các dạng dữ liệu phức tạp như Object hay Array thì cần những phương pháp serialization . Vậy serialization là gì và tại sao phải serialization ?

Trong các ứng dụng client-server ta muốn send các object qua mạng , mà bản thân các giao thức mạng ( tầng thấp ) đều không hiểu object là gì hết nó chỉ hiểu các bit ( 1001100111 ... ) hoặc cao cấp cỡ HTTP cũng chỉ hiểu text và text . Nên chúng ta cần đưa các object về các dạng nhị phân hoặc text , truyền chúng qua mạng rồi về đến client sẽ dựng lại thành các object . Công việc như vậy gọi là serialization và deserialization .

Như vậy mỗi phương pháp serialization - deserialization khác nhau sẽ tạo ra một giao thức khác nhau SOAP,XML-RPC dùng XML , Json,Yaml dùng các nested text block ,...

Các Text based serialization như SOAP,XML-RPC , Json,Yaml tôi sẽ không đi sâu trong bài viết này .
Mà chỉ chỉ ra nhược điểm lớn nhất của chúng là vấn đề tốc độ truyền tải sẽ rất chậm .
Chậm vì các xml tag của SOAP,XML-RPC vừa thừa, vừa tốn thời gian serialization - deserialization.

Chính vì nhu cầu cần có giao thức có tốc độ truyền và serialization - deserialization nhanh hơn , và tốt hơn cả là binary thay vì text base nên với mỗi ngôn ngữ - công nghệ có các giải pháp khác nhau .
Như Java có RMI
Như .Net có .Net remoting
Python có RPyC
Flash có AMF

Vậy AMF là công nghệ RPC giúp client là Flash/AIR player giao tiếp với server .
Server của AMF có thể là :

Java - BlazeDS, RED 5, Cinnamon, OpenAMF, Pimento, Granite
.NET - WebORB, FluorineFx, AMF.NET
PHP - AMFPHP, SabreAMF, WebORB
Python - PyAMF, Flashticle, amfast, Plasma
Perl - AMF::Perl
Ruby - RubyAMF, WebORB

Nếu kết hợp với các framework phía server thì có các thư viện

Ruby on Rails - RubyAMF
Zend Framework - Zend_AMF
OSGi Framework - AMF3 for OSGi
Django - Django AMF
CakePHP - CakeAMFPHP

3. PHPAMF .
Như vậy PHPAMF chẳng qua chỉ là một thư viện giúp flash client có thể gửi và nhận dữ liệu với server side là php .
PHPAMF có một số đặc điểm
.... ( lười list)
Cụ thể các công việc mà PHPAMF sẽ làm khi nhận được flash client yêu cầu :

* Deserializes the request
* Finds the corresponding remote class
* Instantiates the class
* Performs security checks
* Calls the remote method using the specified arguments
* Serializes the returned data
( Lười dịch -> cần sơ đồ )

4. Cài đặt và Demo .
Only demo , nothing here :D

Không có nhận xét nào:

Đăng nhận xét