Flash Remoting 是 swf 使用 AMF 二元資料格式與伺服器的 Remoting Component 進行資料交換的技術(透過 HTTP)
在 PHP 有 amfphp, Zend_Amf 等
但由於 PHP 5.3 與 amfphp 1.9 在 localhost 測試時會出現錯誤
在找不到解決方法下,我打算改由 Zend_Amf 來上手
Zend Framework 是 Zend 公司針對 PHP 企業級開發的 Framework,而 Zend_Amf 就是其中的一組函式庫
取得的方法很簡單,只要上官方網站下載後解壓縮打開即可
而我是使用 svn 的方式來取得,既然是寫入門還是說清楚一點好了:
1. 首先如果 PC 裡沒有安裝 svn 軟體,可以下載安裝 TortoiseSVN (俗稱小烏龜)軟體
2. 在電腦裡開一個資料夾並命名,如 Zend Framework,按右鍵選擇 SVN Checkout,網址輸入 http://framework.zend.com/svn/framework/standard/trunk
3. 此時會跟網址上的檔案進行版本更新,但因為 Zend Framework 並不是很小,所以等它跑完大約需要幾分鐘
至於布署方式,只要把 library 的內容放到網站目錄下即可
(租用虛擬主機空間時由於無法更改主機設定故要用這種方式來布署)
我是選擇直接在 php.ini 裡做 include 設定,檔案就不用貼來貼去占空間
include 的方法如下:只要找到 include_path 這一行,然後以分號分隔把路徑加上去即可
路徑請記得改成自己的...
; Windows: "\path1;\path2" include_path = ".;c:\php\includes;C:\Zend Framework\library"
這樣安裝跟布署就完成了!!
接下來還有一個重點就是要設定 Gateway 程式
在網頁目錄下新增一個 zend_gateway.php 輸入以下程式碼
並開一個子資料夾來放 remoting component,本例為 AMFapp/
<?php
//匯入 Zend/Amf/Server.php 檔案
require_once 'Zend/Amf/Server.php';
// 建立 Server 物件
$server = new Zend_Amf_Server(); //由於檔案是在 Zend/Amf/ (套件路徑)下,所以 new 的時候要寫為 Zend_Amf_Server
$server->addDirectory('AMFapp/'); //呼叫 Zend_Amf_Server 的 addDirectory 方法,將指定路徑下的檔案自動加進來
//呼叫 handle 方法處理資料並放入 $response 裡輸出
$response = $server->handle();
echo $response;
?>
而在 AMFapp 裡,開一個 HelloWorld.php 來測試吧
<?php
class HelloWorld{
/**
* 就是 Hello World 啦!!
* @param string $arg
* @return string
*/
function sayHelloWorld($arg = ""){
$returnValue = "Hello Zend_Amf!! 如果看到這就成功嚕!!". $arg;
return $returnValue;
}
}
?>
接下來是 ActionScript 的部分:(關於 NetConnection 的詳細內容請參閱官方文件)
package {
import flash.display.*;
import flash.net.*;
public class MyTest_zend_01 extends MovieClip {
private var ncZend:NetConnection;
private var rsZend:Responder;
public function MyTest_zend_01() {
//建立 NetConnection 物件
ncZend = new NetConnection();
//將 Gateway 的完整路徑傳入 connect 方法
ncZend.connect("http://localhost/zend_gateway.php");
//建立 Responder 物件,指定回應與錯誤的 callback func
rsZend = new Responder(onResult, onFault);
//呼叫 call 方法開始連線
//注意這裡是用 SomeClass.SomeFunc 的表示方式
ncZend.call('HelloWorld.sayHelloWorld', rsZend, "這是傳入的字串");
}
//回應處理函式
private function onResult(result:Object):void {
trace(result);
}
//錯誤處理函式
private function onFault(err:Object):void {
trace("fault:");
for (var i:String in err) {
trace(i, ":", err[i]);
}
}
}
}
測試發布時如果看到 output 有 trace 出訊息就表示成功了!!
沒有留言:
張貼留言