Web

关于 Amfphp

Flying
2013-07-16 / 0 评论 / 166 阅读 / 正在检测是否收录...

这是一篇讲解如何使用 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

  1. 下载

http://www.php.net 下载 PHP 5.2.1 zip package,将其解压缩到硬盘。

  1. 修改 php.ini

将 PHP 根目录下的 php.ini-recommended 更名为 php.ini,然后打开它,将 extension_dir 的值设定为 PHP 根目录 \ext

  1. 添加.php 映射

打开 Internet 信息服务 > 默认网站 > 属性 > 主路径 > 配置 > 添加,在弹出的对话框中设定可执行文件 php5isapi.dll 的位置,设定扩展名为 .php。单击确定。

  1. 添加系统变量

选择我的 电脑 > 属性 > 高级 > 环境变量,添加系统变量 PHPRC,设定其值为 PHP 根路径。

找一些简单实例来测试一下 PHP 是否安装成功。

安装 MySQL

  1. 下载

http://www.mysql.com/ 下载 mysql-essential-5.0.37-win32.msi。采用默认安装就行。

  1. 添加一个 Path 变量值:[MySQL 根路径]\bin
  2. 与 PHP 整合

打开 php.ini,然后去掉 extension=php_dba.dllextension=php_dbase.dllextension=php_gd2.dllextension=php_ldap.dllextension=php_mbstring.dllextension=php_mysql.dll 的分号。

如果 Web 应用不需要处理数据库,可跳过这一步。

安装 Amfphp

目前 amfphp1.9 的最新版是 amfphp1.9 beta2,可以到官网下载。将其解压缩到硬盘,使用 IIS 设定一个 Web 应用虚拟路径,假定别名为 flashservices。键入 http://localhost/flashservices/gateway.php,会出现 amfphp 网关的一个说明文件。AMFPHP 基本的安装已经完成。

安装 AMF 扩展

最新版的 AMFPHP 加入了一个 AMF 扩展:它是用 C 写了一个 AMF 协议的解码和编码器,执行效率大大提升。尤其是大的数据源的时候,用 php 编码可能会超时而不能完成的操作,用 AMF 扩展就可以完成。 安装比较简易:

  1. 下载

http://www.teslacore.it/projects/amfext/amfext-0.8.7a-bin.zip 下载,将 php_amf.dll 解压缩到 PHP 根路径\ext 中。

  1. 配置

打开 php.ini,加上下面这一行:extension=php_amf.dll

我们不需要对 AMFPHP 本身做任何修改或者配置。系统会自动监测那个扩展是否存在,存在就会自动应用,否则就会使用 PHP 的解码和编码。

将其 web 共享,别名为 flashservices。支持 Amfphp 的 Web 应用就配置好了。我们只需要将写好远程服务类放到 Amfphp 根目录 \services` 中就可以在 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, privateremote 三种,如果提供远程服务的,access 的值只能为 remote。这几个属性当中,只有 access 是必有的。如果使用 Amfphp1.2 及其更高版本,MethodTable 已经作为一个类来处理了,我们可以直接导入它,然后使用其 create 方法来创建构造函数。

新版 Amfphp 附带的服务浏览器功能不如以前,有时间跟大家讲解。

使用 Amfphp 实现 Flex 与 php 通信

接下来我们简要讲解怎样实现使用 Amfphp 实现 Flash 与 php 的通信。通过学习,我们将了解使用 Amfphp Flash Remoting 开发 Flex RIAs 的基本流程。

如果你已经看懂使用 Fluorine 实现 Flex 与.NET 通信,你基本上明白了怎样实现 Flash 与 Amfphp 的通信。主要有两点不同:

  • Web 应用的根目录不同,如下图:

php_location.gif

  • 发布文件夹的路径不同,如下图:

php_path.gif

我们改进了一下 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 的接合。
  1. 新建项目:新建一个 Flex 工程,选择应用服务器类型为 php,如下图:

php_create.gif

  1. 创建 UI:新建 HelloWorld.mxml,在主程序中放置 nameTextInputsubmitButtonresultLabel
  2. 选择 Zend AMF:在 数据/服务 视图中单击 连接数据/服务,在 PHP 的三种数据服务中选择 PHP(即 Zend AMF),如下图:

php_type.gif

  1. 配置 PHP 服务:选择 Web 应用根目录下和 PHP 类也可以使用 PHP 模板类。此处选择已经写好的 HelloWorld.php,详见使用 Amfphp 实现 Flash 与服务器通信

php_hello_service.gif

  1. 自动安装 Zend AMF:如果你的电脑先前未安装 Zend AMF,此时会弹出一个提示框让我们自动安装,这种安装的一个好处就是不用额外配置。

php_amf_install.gif

  1. 选择服务操作:在服务操作对话框中将列出所选类的公有方法。

php_operation.gif

  1. 配置返回数据类型:在数据/服务视图中选择 sayHello 方法,在右侧工具栏单击 配置返回数据类型 按钮。

php_view.gif

  1. 在配置操作数据类型中选择 String,如图:

php_sayHello_return.gif

  1. 生成服务调用:选择 submitButton,单击右键选择生成服务调用...,选择相应的服务和操作。也可以直接将 sayHello 方法拖曳到该按钮上。

php_sayHello.gif

  1. 改写代码:在代码视图中将 sayHelloResult.token = helloWorld.sayHello(userName) 改写为 sayHelloResult.token = helloWorld.sayHello(nameTextInput.text)。这也是本实例唯一需要编码之处。
  2. 绑定返回结果:选择 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 创建主/详细表单应用。

  1. 配置 PHP 服务:在上一回新建的工程中新增 Student.mxml,添加一个 DataGrid 控件。连接数据/服务,在 PHP 的三种数据服务中选择 PHP。在配置 PHP 服务中选择生成示例 PHP 类

php_student_service.gif

  1. 修改 Student.php 类。修改数据库连接和操作,保留 getAllItemsgetItem 方法。在数据/服务视图右侧工具栏单击 与服务器文件同步 按钮,视图中将只显示保留显示的两个方法。
  2. 配置返回数据类型:选择 getAllItems 方法,新建自定义数据类型 StudentVO

php_studentvo.gif

如果第 2 步操作正确,将弹出 StudentVO 的属性数据类型修改对话框,StudentVO 的属性数据类型默认下与相应数据表的字段数据类型一致,有点 Hibernate 的味道。

php_studentvo_properties.gif

用同样的方法为 getItem 方法配置返回数据类型。

php_scorevo.gif

选择合适的参数数据类型。

param_datetype.gif

  1. 配置 DataGrid 列:在 数据/服务视图 中将 getAllItems 方法拖曳到 DataGrid 上,单击其属性面板中的配置列按钮,在该对话框中配置列。和在 Visual Studiok 中配置列类似,感觉很轻松。运行一下程序,DataGrid 已经填充好数据了。

php_config_column.gif

  1. 生成详细信息表单:选择 DataGrid 控件,右键单击 生成详细信息表单...,取消使表单可编辑,勾出 选建立新服务调用以获取详细信息,选择 getItem 方法。

php_detail_form.gif

  1. 选择详细信息属性及控件类型。

php_detail_mapping.gif

Flash Builder 4+Zend AMF 详细信息表单的应用就做好了。amfphp 中要将自定义类映射到 AS,得额外定义一个 PHP ValueObject。Zend AMF 利益于 Zend Framework,自动完成了这一过程。最终效果如下图:

php_detail_result.gif

点击此处 下载本实例的源码。

让 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 格式,就可以支持中文。

UTF-8 格式

上图是利用 Dreamweaver 设置的,当然我们也可以使用 UltraEdit 等其它工具来设置 UTF-8 格式。

注意:不要选择 BOM。

教学资源

  1. 英文
  1. 中文
7

评论 (0)

取消