一、AMFPHP简介

Amfphp是PHP的RPC工具,它可以使PHP与下述技术无缝通信:
(1) Flash 和 Flex Remoting
(2) JavaScript JSON 和 Ajax JSON
(3) XML和XML-RPC

1、什么是RPC?

远端程序调用(RPC, Remote Procedure Call) 是一种客户端与服务器端交换数据方式。我们可以调用本地对象带对各种参数方法 ,设置回调并接受调用结果。我们不用关心发送和接收数据的实现细节。实现细节通常是抽象的, 就像我们在调用本地方法一样.

2、工作原理

客户端(Flash)与服务器端(php), 使用相同的方式描述方法调用和复杂数据。客户端序列化请求并将它发送到网关Amfphp。Amfphp再执行:
(1) 反序列化请求
(2) 找到相应的远程服务类
(3) 实例化类
(4) 执行安全检查
(5)(使用指定参数)调用服务器端方法
(6) 序列化返回的数据

Amfphp 可以正确地序列化、反序列化复杂类型数据。除了对象和数组,它还支持resources 数据连接资源,这就意味着我们可以通过调用远程方法简单返回mysql_query,amfphp 会处理这一切。 如果平台支持 (目前来说,Flash Remoting 和Flex Remoting), phpamf还可以处理循环引用和自定义数据。 它也支持简单的远程调试。还有amfphp 附带一个服务浏览器,它可以在创建客户端代码前测试远程服务。amfphp 1.0.1还添加了模板,可以自动生成客户端代码。Amfphp 1.9更是新增了对AMF3的支持。
详见:AMFPHP项目主页:http://www.amfphp.org/

二、AMFPHP环境搭建

amfphp下载:http://sourceforge.net/projects/amfphp/files/amfphp/
这里我们下载amfphp 1.9.zip
下载后解压到web服务器的工作目录下,前提是您已配置好php的工作环境。这里为了简单起见,使用IIS7.0+php5.2
即:将amfphp1.9解压到C:inetpubwwwroot
browser:目录为amfphp可供我们直接在浏览器浏览的目录
services:目录是我们自己开发的php类文件存放目录
gateway.php是一个比较重要的文件。
打开gateway.php,定位到127行
//$gateway->setCharsetHandler(“utf8_decode”, “ISO-8859-1”, “ISO-8859-1”);
$gateway->setCharsetHandler(“utf8_decode”, “utf-8”, “utf-8”);
设置中文字符支持
如果服务器和php环境正常的话,在地址栏输入http://localhost/amfphp/browser/将会看到如下图所示
配置参数如上图所示,点save保存设置。
编写一个php与mysql交互的类。
product.php

<?php
class product{

function print_xml(){
//获取数据库连接
$link=@mysql_connect(“localhost”,”root”,””) or die(‘数据库连接错误’);
//选择数据库
mysql_select_db(“compass”,$link);
//设置数据库编码
mysql_query(“set names utf8”,$link);
//查询数据库
$result=mysql_query(“select * from product”);

//创建DOMDocument对象
$doc = new DOMDocument(‘1.0′,’utf-8’);
//格式化输出
$doc->formatOutput = true;

//创建根元素
$root = $doc->createElement(‘root’);
//添加根元素
$root = $doc->appendChild($root);

//从数据库中获取数据每一条是一个product
while($data=mysql_fetch_assoc($result)){

//创建product标签
$product=$doc->createElement(‘product’);
//添加product标签
$product = $root->appendChild($product);

//创建Id元素
$id = $doc->createElement(‘id’);
//添加Id
$id = $product->appendChild($id);
//创建文本内容
$idtext = $doc->createTextNode($data[‘id’].”);
//将文本添加到id标签内
$idtext = $id->appendChild($idtext);

//创建name标签
$name = $doc->createElement(‘name’);
//添加name
$name = $product->appendChild($name);
//创建name标签的文本
$nametext = $doc->createTextNode($data[‘name’].”);
//设置name标签的文本
$nametext = $name->appendChild($nametext);

//创建price标签
$price = $doc->createElement(‘price’);
//添加price
$price = $product->appendChild($price);
//创建price标签的文本
$pricetext = $doc->createTextNode($data[‘price’].”);
//设置price标签的文本
$pricetext = $price->appendChild($pricetext);
}
//关闭数据库连接
mysql_close($link);
//保存xml
return $doc->saveXML();
}
}
?>

注意该文件的编写规则及存放路径
php中类文件的编写符合java中类的编写,即文件名与类名大小写一致
该文件必须存放于C:inetpubwwwrootamfphpservices目录下
方法最后使用return 返回而不是输出
http://localhost/amfphp/browser/中的浏览情况