看标题就可以猜到,本实践使用了Flash Remoting方式连接服务器,并采用最新的AMF3数据传输协议,好处就不多说了。
首先要解决的问题就是怎样把CakePHP和AMFPHP结合,首先找到的是cakeamfphp,看一下最后版本更新日志,竟然是06年10月,接着找到作者为cakephp 1.2写的修改方法,显然他不想再更新cakeamfphp了。
继续寻觅,又找到了cakeswxphp,支持cakephp1.2,看起来不错,正打算用的时候发现作者做了个性能测试,cakeswxphp性能竟然低的可怕,先放着,cakephp果然没有让我失望,在强大的google帮助下,又找到了一个叫做cpamf的插件,并且是参考了cakeamfphp和cakeamf(后来才发现,cakeamfphp的作者又重新写了一个新的cakephp插件,不过需要AMFEXT的支持)写的,并且可以不用AMFEXT,最方便之处是可以让flash以remoting方式直接访问cakephp里controller的action来传递和获取数据,这就是我想要的了。
搭建cakephp环境,把下载回来的CPamf解压到 app/plugins 目录下,然后直接访问 http://localhost/cpamf/gateway ,显示如下信息,表示安装成功。
amfphp and this gateway are installed correctly. You may now connect to this gateway from Flash.
Note: If you’re reading an old tutorial, it will tell you that you should see a download window instead of this message. This confused people so this is the new behaviour starting from amfphp 1.2.
View the amfphp documentation
Load the service browser
建立数据表:
CREATE TABLE IF NOT EXISTS `games` ( `gameId` int(11) NOT NULL auto_increment COMMENT 'game id', `gameName` varchar(100) collate utf8_unicode_ci NOT NULL COMMENT 'game name', `gameDeveloper` varchar(100) collate utf8_unicode_ci NOT NULL default 'Anonymous' COMMENT 'game Developer', PRIMARY KEY (`gameId`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC AUTO_INCREMENT=100000 ;
写Model和Controller:
Game Model (Game.php):
class Game extends AppModel
{
var $name = 'Game';
var $primaryKey = 'gameId';
}
Game Controller (games_controller.php):
class GamesController extends AppController
{
var $name = 'Games';
function index() {}
function getAllGames()
{
$games = $this->Game->find('all');
//$gameCollection = new ArrayCollection($games);
return $games;
}
function getGame($id = 0)
{
$game = $this->Game->find('all', array('conditions' => array('Game.gameId' => $id)));
return $game;
}
}
查看service browser:
打开 http://localhost/cpamf/browser ,顺利的话,就会在左边栏显示出GamesController,点击后就会在右栏显示出Controller里的action列表,看看里面是不是有getAllGames和getGame,选择getAllGames,点击Call按钮,就会在下方Results标签内看到获取的数据了,如图:

用Flash传递和获取数据:
这里我用的flex builder 3来建立actionscript project来测试,代码如下:
package {
import flash.display.Sprite;
import flash.net.*;
public class UseBlobStat extends Sprite
{
private var _netConn:NetConnection = new NetConnection();
public function UseBlobStat()
{
_netConn.objectEncoding = ObjectEncoding.AMF3;
_netConn.connect("http://localhost/cpamf/gateway");
// 获取全部游戏
_netConn.call("GamesController.getAllGames", new Responder(GetGamesComplete, GetGamesError));
// 传递id参数来获到指定游戏
_netConn.call("GamesController.getGame", new Responder(GetGameComplete, GetGamesError), 100000);
}
private function GetGamesComplete(e:Array):void
{
for ( var i:int = 0; i < e.length; i++)
{
trace(e[i]['Game']['gameId'] + '\t' + e[i]['Game']['gameName'] + '\t' + e[i]['Game']['gameDeveloper']);
}
}
private function GetGameComplete(e:Array):void
{
trace("---------------传递参数获取------------------");
trace(e[0]['Game']['gameId'] + '\t' + e[0]['Game']['gameName'] + '\t' + e[0]['Game']['gameDeveloper']);
}
private function GetGamesError():void
{
trace("失败了...");
}
}
}
解决amfphp 1.9中文乱码:
首先是query之前公认的mysql_query(”set names ‘utf8′”);
接着修改gateway.php的127行:
$gateway->setCharsetHandler(”mbstring”, “UTF-8″, “UTF-8″);
文章来自:http://junnan.org/blog/523
浙公网安备 33010602011771号