原文: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 并以此文件名为类名。(注意服务都需要写成类,且和文件名一样,否则服务不了)
- <?php
- class terry_services
- {
- function dosmth($obj)
- {
- return 'services return string';
- }
- }
- ?>
如上图,我们可以看见左边的服务列表中,多了 terry_services 这个 "服务对象",这个服务对象有一个方法 "dosmth”,这个方法有一个参数 "obj"。
我们可以在参数填写部分写入数据,并点击 "call" 按钮来调用服务对象的方法。如下图
可以看到我们执行的效果,返回结果在 标签 "results" 中可以看见,正是我们 php 代码中所写的返回结果。
这里顺便介绍下几个标签页中对应的数据信息
Info: 调用执行情况(调用执行时间等信息)
Results: 返回结果
Tree: 以树的方式显示结果
Recordset view: 数据集结果观察器
Trace: 调试信息返回观察器
我们继续修改PHP端代码,给函数加几个传入参数,并返回一个数组,看看会是什么样子的
- <?php
- class terry_services
- {
- function dosmth($obj, $param2, $param3)
- {
- $return_array = array();
- $return_array['get_obj'] = $obj;
- $return_array['get_p2'] = $param2;
- $return_array['get_p3'] = $param3;
- return $return_array;
- }
- }
- ?>
上图可以看见三个参数,以及对应的输入框
分别填写一些数据,执行看效果如下图:
好了,看见了数组返回结果了吗? 就是一个AS的对象,在AS3里可以当 数组用,也可以当对象用。我们再看看 Tree标签里显示的是什么
看到这里读者应该清楚这个工具的使用,以及服务端代码写法了吧。具体服务端的开发模式,这里不作介绍,以后看有需要再写吧。。。
也许看到这里,大家有一个疑问,就是如果要传递一个对象,如何使用工具来调试呢?
我把服务对象的方法 "dosmth" 修改成一开始的单参数结构
- <?php
- class terry_services
- {
- function dosmth($obj)
- {
- return $obj;
- }
- }
- ?>
这里大家要知道一个概念 "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 从第但个参数开始的参数,都是传给服务端的服务对象的方法的
看如下客户端的代码:
- var callBack = new Object();
- callBack.onResult = function(return_value:Object)
- {
- //...
- }
- var _nc: NetConnection = new NetConnection();
- _nc.connect('http://www.example.com/amfphp/gateway.php');
- _nc.call('terry_services.dosmth', callBack, param);
具体使用哪个服务对象以及方法,在 call 中的第一个参数指定,如果你的服务对象在更深级的目录总,则以 . (点) 来描述深度
如果 terry_services.php 的目录路径为 amfphp/services/ terry/terry_services.php 则这里 call的第一个参数为 'terry.terry_services.dosmth'
call 的第二个参数为服务端返回数据后,NetConnection 回调的对象,这个回调对象必须有一个固定的方法 onResult(param:Object);在这个方法里,你可以对服务端返回的数据进行处理。。。
基本上就是这样一个开发过程,我就不附上客户端的源码了(偶本本没装FLASH)。。。