这是一篇讲解如何使用 Amfphp 实现 Flash 与 PHP 通信的入门级实例教程。通过本例的学习,我们将了解使用 Amfphp 开发 Flash RIAs 的基本流程。
Amfphp 是 PHP 的 RPC 工具,它的优势体现在开源和和对最新技术的支持。它可以使 PHP 与下述技术无缝通信:
Amfphp 简介
- Flash 和 Flex Remoting
- Javascript JSON 和 Ajax JSON
- XML 和 XML-RPC
一、什么是 RPC?
远端程序调用(RPC, Remote Procedure Call) 是一种客户端与服务器端交换数据方式。我们可以调用本地对象的带有不同参数的方法,设置回 调并接受调用结果。我们不用关心发送和接收数据的实现细节。实现细节通常是抽象的, 就像我们在调用本地方法一样。
二、工作原理
客户端(Flash) 与服务器端(php), 使用相同的方式描述方法调用和复杂数据。客户端序列化请求并将它发送到网关 Amfphp。Amfphp 再执行:
- 反序列化请求
- 找到相应的远程服务类
- 实例化类
- 执行安全检查
- (使用指定参数 ) 调用服务器端方法
- 序列化返回的数据
Amfphp 可以正确地序列化、反序列化复杂类型数据。除了对象和数组,它还支持数据连接资源,这就意味着我们可以通过调用远程方法简单返回 mysql_query,Amfphp 会处理这一切。如果平台支持(目前来说,Flash Remoting 和 Flex Remoting),Amfphp 还可以处理循环引用和自定义数据。它也支持简单的远程调试。还有 Amfphp 附带一个服务浏览器,它可以在创建客户端代码前测试远程服务。Amfphp1.0.1 还添加了模板,可以自动生成客户端代码。Amfphp1.9 beta 更是新增了对 AMF3 的支持。
配置支持 Amfphp 的 Web 应用
下面我们仅以 Windows XP、IIS 5.1t 和 Amfphp 1.9 beta 2 为例,讲述怎样配置支持 Amfphp 的 Web 应用。
安装 PHP
- 下载
到 http://www.php.net 下载 PHP 5.2.1 zip package,将其解压缩到硬盘。
- 修改 php.ini
将 PHP 根目录下的 php.ini-recommended
更名为 php.ini
,然后打开它,将 extension_dir
的值设定为 PHP 根目录 \ext
。
- 添加.php 映射
打开 Internet 信息服务 > 默认网站 > 属性 > 主路径 > 配置 > 添加,在弹出的对话框中设定可执行文件 php5isapi.dll
的位置,设定扩展名为 .php
。单击确定。
- 添加系统变量
选择我的 电脑 > 属性 > 高级 > 环境变量,添加系统变量 PHPRC
,设定其值为 PHP 根路径。
找一些简单实例来测试一下 PHP 是否安装成功。
安装 MySQL
- 下载
到 http://www.mysql.com/ 下载 mysql-essential-5.0.37-win32.msi
。采用默认安装就行。
- 添加一个
Path
变量值:[MySQL 根路径]\bin
。 - 与 PHP 整合
打开 php.ini
,然后去掉 extension=php_dba.dll
、extension=php_dbase.dll
、extension=php_gd2.dll
、extension=php_ldap.dll
、extension=php_mbstring.dll
和extension=php_mysql.dll
的分号。
如果 Web 应用不需要处理数据库,可跳过这一步。
安装 Amfphp
目前 amfphp1.9 的最新版是 amfphp1.9 beta2,可以到官网下载。将其解压缩到硬盘,使用 IIS 设定一个 Web 应用虚拟路径,假定别名为 flashservice
s。键入 http://localhost/flashservices/gateway.php,会出现 amfphp 网关的一个说明文件。AMFPHP 基本的安装已经完成。
安装 AMF 扩展
最新版的 AMFPHP 加入了一个 AMF 扩展:它是用 C 写了一个 AMF 协议的解码和编码器,执行效率大大提升。尤其是大的数据源的时候,用 php 编码可能会超时而不能完成的操作,用 AMF 扩展就可以完成。 安装比较简易:
- 下载
到 http://www.teslacore.it/projects/amfext/amfext-0.8.7a-bin.zip 下载,将 php_amf.dll
解压缩到 PHP 根路径\ext
中。
- 配置
打开 php.ini,加上下面这一行:extension=php_amf.dll
我们不需要对 AMFPHP 本身做任何修改或者配置。系统会自动监测那个扩展是否存在,存在就会自动应用,否则就会使用 PHP 的解码和编码。
将其 web 共享,别名为 flashservices
。支持 Amfphp 的 Web 应用就配置好了。我们只需要将写好远程服务类放到 Amfphp 根目录 \service
s` 中就可以在 Flash 和 Flex 中访问了。
本地化设置
因为 PHP 默认的编码语言是 ISO-8859-1,要使前面配置的 Web 应用支持简体中文,最好的方法是打开 Amfphp 根路径下的 gateway.php,将 $gateway->;setCharsetHandler("utf8_decode", "ISO-8859-1", "ISO-8859-1");
修改为 $gateway->;setCharsetHandler("utf8_decode", "utf-8", "utf-8");
同时用 Dreamweaver 将 gateway.php 及 PHP 类保存为 Unicode 编码(不加签名 ) 即可。要解决 MySQL 中的中文乱码问题,请用 mysql_query("set names 'gbk'");
。
使用 Amfphp 实现 Flash 与服务器通信
Amfphp 通过 PHP 类文件可以实现 Flash 与远程服务的数据交换。在本例中,我们将使用一个简单的 PHP 类来实现 HelloWorld
远程服务。
如果对 Flash Remoting 不太了解,请参看前面的入门教程。本文假定我们已经配置 好了 Amfphp 环境。将下面的代码保存为 HelloWorld.php
,并放置在 Amfphp 根目录 \services\tutorials\remoting
下。
<?php
class HelloWorld {
/**
* @desc 向用户表示友好问候
* @access remote
* @returns String
*/
function sayHello($userName) {
return "您好,$userName 。这是来自 Amfphp Flash Remoting 的问候";
}
}
?>
这就是一个很普通的 PHP 类编写,PHP 类的语法与编写 ActionScript 2.0 类的语法相似。唯一特殊的地方就是它使用了 javadoc 注释。为什么要这样 注释呢?这是为了将注释显示在服务浏览器中,方便团队开发。
返回到 Flash,注释掉其它版本的网关路径所用的代码。测试影片,你将收到来自 AmfphpFlash Remoting 的问候。
当然,你仍可以使用 Amfphp1.9 以前的语法。代码如下:
<?php
class HelloWorld {
function HelloWorld () {
$this->methodTable = array(
"sayHello" => array(
"description"=> "向用户问候",
"access"=> "remote",
"arguments" => array("userName")
)
);
}
function sayHello ($userName) {
return "您好,$userName 。这是来自 Amfphp Flash Remoting 的问候";
}
}
?>
在 PHP 类的构造函数使用 methodTable
对象,methodTable
是 PHP 类方法的集合数组,每一个方法都是一个元,每一个元素又是一个关系数组。其 中属性 description 描述该方法的功能,属性 access
说明该方法的访问权限,有 public
, private
和 remote
三种,如果提供远程服务的,access
的值只能为 remote
。这几个属性当中,只有 acces
s 是必有的。如果使用 Amfphp1.2 及其更高版本,MethodTable 已经作为一个类来处理了,我们可以直接导入它,然后使用其 create 方法来创建构造函数。
新版 Amfphp 附带的服务浏览器功能不如以前,有时间跟大家讲解。
使用 Amfphp 实现 Flex 与 php 通信
接下来我们简要讲解怎样实现使用 Amfphp 实现 Flash 与 php 的通信。通过学习,我们将了解使用 Amfphp Flash Remoting 开发 Flex RIAs 的基本流程。
如果你已经看懂使用 Fluorine 实现 Flex 与.NET 通信,你基本上明白了怎样实现 Flash 与 Amfphp 的通信。主要有两点不同:
- Web 应用的根目录不同,如下图:
- 发布文件夹的路径不同,如下图:
我们改进了一下 mxml,为 sayHello
方法添加了 result
事件和 fault
事件,当调用远程方法成功时就会侦听到 result
事件并执行 Actionscript 代码块中的 resultHandler
方法,反之则会侦听到 fault
事件并执行 faultHandle
方法。代码加下:
运行测试一下,label
将显示来自 Amfphp Flash Remoting 的问候。整一个错误出来,比如修改一下方法名或服务路径,再运行程序,label 将显示错误信息。可见,这样的代码更像在 Flash 中使用 Flash Remoting,更有扩展性。
补充:要用 Flex 编辑 Amfphp Flash Remoting 应用程序,你还要手动添加 services-config.xml。
我已经给大家编写好了,点击下载 并解压到 Amfphp 根目录下。
使用 Flash Builder 4 和 Zend AMF 创建数据为中心的简单应用
Data Centric Development 是 Flash Builder 4 的一大亮 点,以数据服务为中心的开发方式,大大方便了前端 Flex 与后端应用服务器的整合。今天我们以 Hello World 为例来介绍怎样使用 Flash Builder 4 和 Zend AMF 创建数据为中心应用 。
注意:我们可以简单的将 ZendAMF 看作 Zend 与 Amfphp 的接合。
- 新建项目:新建一个 Flex 工程,选择应用服务器类型为 php,如下图:
- 创建 UI:新建
HelloWorld.mxml
,在主程序中放置 nameTextInput、submitButton 和 resultLabel。 - 选择 Zend AMF:在 数据/服务 视图中单击 连接数据/服务,在 PHP 的三种数据服务中选择 PHP(即 Zend AMF),如下图:
- 配置 PHP 服务:选择 Web 应用根目录下和 PHP 类也可以使用 PHP 模板类。此处选择已经写好的 HelloWorld.php,详见使用 Amfphp 实现 Flash 与服务器通信。
- 自动安装 Zend AMF:如果你的电脑先前未安装 Zend AMF,此时会弹出一个提示框让我们自动安装,这种安装的一个好处就是不用额外配置。
- 选择服务操作:在服务操作对话框中将列出所选类的公有方法。
- 配置返回数据类型:在数据/服务视图中选择 sayHello 方法,在右侧工具栏单击 配置返回数据类型 按钮。
- 在配置操作数据类型中选择 String,如图:
- 生成服务调用:选择 submitButton,单击右键选择生成服务调用...,选择相应的服务和操作。也可以直接将 sayHello 方法拖曳到该按钮上。
- 改写代码:在代码视图中将
sayHelloResult.token = helloWorld.sayHello(userName)
改写为sayHelloResult.token = helloWorld.sayHello(nameTextInput.text)
。这也是本实例唯一需要编码之处。 - 绑定返回结果:选择 resultLabel,在数据/服务视图右侧工具栏单击 将控件绑定到数据 按钮。也可以直接将 sayHello 方法拖曳到该标签上,选择现有调用结果。绑定返回 结果的控件上方和其属性面板会显示一个绑定图标,可以重新绑定返回结果。
Flash Builder 4+Zend AMF 的 HelloWorld 的应用就做好了。AS 代码基本上是 Flash Builder 给我们生成的,编程变成了流程操作,有了 Data Centric Development,设计者也可以做 Data-driven 的应用了。
使用 Flash Builder 4 和 Zend AMF 创建主/详细表单应用
Hello World 实例毕竟只是操作简单数据,体现不了 Data Centric Development 的优势,此文将介绍怎样使用 Flash Builder 4 和 Zend AMF 创建主/详细表单应用。
- 配置 PHP 服务:在上一回新建的工程中新增
Student.mxml
,添加一个 DataGrid 控件。连接数据/服务,在 PHP 的三种数据服务中选择 PHP。在配置 PHP 服务中选择生成示例 PHP 类。
- 修改
Student.php
类。修改数据库连接和操作,保留getAllItems
和getItem
方法。在数据/服务视图右侧工具栏单击 与服务器文件同步 按钮,视图中将只显示保留显示的两个方法。 - 配置返回数据类型:选择 getAllItems 方法,新建自定义数据类型 StudentVO。
如果第 2 步操作正确,将弹出 StudentVO 的属性数据类型修改对话框,StudentVO 的属性数据类型默认下与相应数据表的字段数据类型一致,有点 Hibernate 的味道。
用同样的方法为 getItem 方法配置返回数据类型。
选择合适的参数数据类型。
- 配置 DataGrid 列:在 数据/服务视图 中将 getAllItems 方法拖曳到 DataGrid 上,单击其属性面板中的配置列按钮,在该对话框中配置列。和在 Visual Studiok 中配置列类似,感觉很轻松。运行一下程序,DataGrid 已经填充好数据了。
- 生成详细信息表单:选择 DataGrid 控件,右键单击 生成详细信息表单...,取消使表单可编辑,勾出 选建立新服务调用以获取详细信息,选择 getItem 方法。
- 选择详细信息属性及控件类型。
Flash Builder 4+Zend AMF 详细信息表单的应用就做好了。amfphp 中要将自定义类映射到 AS,得额外定义一个 PHP ValueObject。Zend AMF 利益于 Zend Framework,自动完成了这一过程。最终效果如下图:
点击此处 下载本实例的源码。
让 Zend AMF 支持 UTF-8
在 Flash Builder 4 中,新增了使用 Zend AMF 向导访问服务器数据,很明显 Zend AMF 已经取代了 Amfphp 成为 Flex 与 PHP 数据通信的最佳解决方案。不过,同 Amfphp 一样,Zend AMF 也面临一个编码的问题。怎样让 Zend AMF 支持 UTF-8 呢?更进一步说,怎样解决 ZendAMF 的中文乱码问题呢?
不知道大家还记得前文介绍怎样配置支持 Amfphp 的 Web 应用 吗?要设置 Amfphp 支持 UTF-8 得在 gateway 中显示地修改编码。相比之下,ZendAMF 的设置更简单些,因为它本身就支持 UTF-8。只要 gateway 和 php 服务类都是 UTF-8 格式,就可以支持中文。
上图是利用 Dreamweaver 设置的,当然我们也可以使用 UltraEdit 等其它工具来设置 UTF-8
格式。
注意:不要选择 BOM。
教学资源
- 英文
- flash-db.com tutorials and forum on AMFPHP
- sephiroth.it tutorials and blog on AMFPHP
- Macromedia Remoting Developer Center
- flashcoders mailing list
- Amfphpmailing list
- Amfphpdevelopment blog
- Flash Remoting book companion site
- Setting up PHP on your webserver
- S?nke Rohde - tutorial
- Jesse Warden - Flash, Flex and AMFPHP
- SwapDepths tutorials
- 中文
评论 (0)