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 出訊息就表示成功了!!
沒有留言:
張貼留言