PHP的AMF服务端的开发

 原文:http://bbs.9ria.com/thread-5157-1-1.html

 今天是比较多的时间来写一些教程来告诉大家如何使用PHP来开发AMF服务端了...


AMF协议的支持,我们不需要从头开始做,当然如果你了解PHP的SOAP支持,也可以自己做;我这里就介绍利用 AMFPHP 来开发AMF服务端.

首先下载AMFPHP的地址是 http://sourceforge.net/project/showfiles.php?group_id=72483#files  
amfphp官网地址是  http://www.amfphp.org/

把下载下来的文件解开,基本目录结构是



其中要注意的是 services 目录,这个目录就是放置我们把开发好的服务端代码的,你可以开发单个文件的服务直接放到此目录下,也可以专门建立一个目录存放你的服务端代码。

而目录 browser 则是调试我们的 amf 服务端代码的工具目录(amfphp/browser/index.html),大家访问此文件就知道了。

这里要提醒下,此文讨论的是 amf 协议最新的 amf3 协议 ,以及AMFPHP运行在PHP5.x以上的版本。

假设建立一个服务文件  terry_services.php 并以此文件名为类名。(注意服务都需要写成类,且和文件名一样,否则服务不了)

  1. <?php
  2. class terry_services
  3. {
  4.         function dosmth($obj)
  5.         {
  6.                 return 'services return string';
  7.         }
  8. }
  9. ?>
复制代码
然后我们访问 amfphp/browser/index.html (第一次访问需要设置AMF协议,这里选 AFM3,确定后就可以了),看下图



如上图,我们可以看见左边的服务列表中,多了 terry_services 这个 "服务对象",这个服务对象有一个方法 "dosmth”,这个方法有一个参数 "obj"。

我们可以在参数填写部分写入数据,并点击 "call" 按钮来调用服务对象的方法。如下图



可以看到我们执行的效果,返回结果在 标签 "results" 中可以看见,正是我们 php 代码中所写的返回结果。

这里顺便介绍下几个标签页中对应的数据信息
Info:  调用执行情况(调用执行时间等信息)
Results: 返回结果
Tree:   以树的方式显示结果
Recordset view: 数据集结果观察器
Trace: 调试信息返回观察器

我们继续修改PHP端代码,给函数加几个传入参数,并返回一个数组,看看会是什么样子的
  1. <?php
  2. class terry_services
  3. {
  4.         function dosmth($obj, $param2, $param3)
  5.         {
  6.                 $return_array = array();
  7.                 $return_array['get_obj'] = $obj;
  8.                 $return_array['get_p2'] = $param2;
  9.                 $return_array['get_p3'] = $param3;

  10.                 return $return_array;
  11.         }
  12. }
  13. ?>
复制代码
点刷新图标按钮刷新后看到下图效果(不是浏览器刷新按钮哦)


上图可以看见三个参数,以及对应的输入框

分别填写一些数据,执行看效果如下图:


好了,看见了数组返回结果了吗? 就是一个AS的对象,在AS3里可以当 数组用,也可以当对象用。我们再看看 Tree标签里显示的是什么

看到这里读者应该清楚这个工具的使用,以及服务端代码写法了吧。具体服务端的开发模式,这里不作介绍,以后看有需要再写吧。。。

也许看到这里,大家有一个疑问,就是如果要传递一个对象,如何使用工具来调试呢?
我把服务对象的方法  "dosmth" 修改成一开始的单参数结构
  1. <?php
  2. class terry_services
  3. {
  4.         function dosmth($obj)
  5.         {
  6.                 return $obj;
  7.         }
  8. }
  9. ?>
复制代码
这个代码可以看出直接把对象返回给客户端的。我要告诉大家怎么使用这个工具来调试传入对象。
这里大家要知道一个概念 "JSON”,具体大家可以去查资料,大概意思就是 javascript 中的对象结构的串化的方式
如一个javascript数组:
a['one']='onev';
a['two']=2;
把这个数组串化(序列化)后的结果就是 {"one":"onev","two":2},其实就是用大括号,双引号,冒号来表示数组,传递后,并还原。
这里调试工具支持参数以 JSON 的方式传入,它会自动解析成数组对象,并传递到服务端。


好了~~ 服务端也知道怎么写了,参数也知道怎么传入了,对象也知道怎么调试了,接下来最后一步就是如何在客户端使用AFM协议和服务端的PHP代码进行通讯了。

AS3里有一个类 NetConnection,它是支持AMF协议的,AS3里它支持的AMF3协议。
主要使用到它的 connect方法和call方法
参数结构如下:
NetConnection.connect(服务地址)
NetConnection.call('目录 . 对象 . 方法名', 回调对象, 参数, [参数2], [参数3] ...)
这里 call 从第但个参数开始的参数,都是传给服务端的服务对象的方法的

看如下客户端的代码:
  1. var callBack = new Object();
  2. callBack.onResult = function(return_value:Object)
  3. {
  4.     //...
  5. }

  6. var _nc: NetConnection = new NetConnection();
  7. _nc.connect('http://www.example.com/amfphp/gateway.php');               
  8. _nc.call('terry_services.dosmth', callBack, param);
复制代码
注意 connect 连接的是amfphp下 gateway.php (这个是固定的)
具体使用哪个服务对象以及方法,在 call 中的第一个参数指定,如果你的服务对象在更深级的目录总,则以 . (点) 来描述深度
如果 terry_services.php 的目录路径为 amfphp/services/ terry/terry_services.php 则这里 call的第一个参数为 'terry.terry_services.dosmth'

call 的第二个参数为服务端返回数据后,NetConnection 回调的对象,这个回调对象必须有一个固定的方法 onResult(param:Object);在这个方法里,你可以对服务端返回的数据进行处理。。。

基本上就是这样一个开发过程,我就不附上客户端的源码了(偶本本没装FLASH)。。。

posted on 2011-01-11 11:46  yangjian  阅读(449)  评论(0编辑  收藏  举报

导航