AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程


Posted in PHP onMay 10, 2010

它可以使PHP与下述技术无缝通信:
(1) Flash 和 Flex Remoting
(2) JavaScript JSON 和 Ajax JSON
(3) XML 和XML-RPC
什么是RPC
远端程序调用(RPC, Remote Procedure Call) 是一种客户端与服务器端交换数据方式。我们可以调用本地对象带对各种参数方法设置回调并接受调用结果。我们不用关心发送和接收数据的实现细节。实现细节通常是抽象的,就像我们在调用本地方法一样。
AMFPHP的工作原理
 客户端(Flash / Flex)与服务器端(PHP) 使用相同的方式描述方法调用和复杂数据。客户端序列化请求并将它发送到网关AMFPHP。AMFPHP再执行:

(1) 反序列化请求

(2) 找到相应的远程服务类

(3) 实例化类

(4) 执行安全检查

(5)(使用指定参数)调用服务器端方法

(6) 序列化返回的数据

AMFPHP可以正确地序列化、反序列化复杂类型数据。除了对象和数组,它还支持 resources 数据连接资源,这就意味着我们可以通过调用远程方法简单返回mysql_query,amfphp 会处理这一切。如果平台支持 (目前来说,Flash Remoting 和Flex Remoting),AMFPHP还可以处理循环引用和自定义数据它也支持简单的远程调试。还有AMFPHP附带一个浏览器,它可以在创建客户端代码前测试远程服务。AMFPHP 1.0.1还添加了模板,可以自动生成客户端代码。AMFPHP 1.9 beta更是新增了对AMF3的支持。
简单示例
下面我们通过一个简单的登录示例来对AMFPHP有一个初步的认识,将分别从客户端和服务器端两个部分进行介绍。
一,Flex客户端:
代码

import mx.controls.Alert; 
import mx.rpc.remoting.mxml.RemoteObject; 
import mx.rpc.events.*; 
public var login_remoteObj:RemoteObject = null; 
public function initLoginRemoteObject():void 
{//初始化RemoteObject 
this.login_remoteObj = new RemoteObject(); 
this.login_remoteObj.source = "Login"; 
this.login_remoteObj.destination = "amfphp"; 
this.login_remoteObj.showBusyCursor = true; 
this.login_remoteObj.endpoint = "http://localhost/MyTest/amfphp/gateway.php"; 
this.login_remoteObj.doLogin.addEventListener("result", loginHandler); 
this.login_remoteObj.doLogin.addEventListener("fault", faultHandler); 
} 
public function doLogin():void 
{//登陆操作,向服务器提交数据 
var name:String = this.txtName.text; 
var pwd:String = this.txtPassword.text; 
var data:Array = new Array(); 
data.push(name); 
data.push(pwd); 
this.login_remoteObj.getOperation("doLogin").send(data); 
} 
public function loginHandler(event: ResultEvent):void 
{//处理服务器返回的结果 
var result:Array = event.result as Array; 
var flag:String = result[0]; 
if (flag == "0") { 
Alert.show("登陆失败: " + result[1]); 
} else if (flag == "1") { 
Alert.show("登陆成功: " + result[1]); 
} else if (flag == "-1") { 
Alert.show("异常: " + result[1]); 
} 
} 
public function faultHandler(event: FaultEvent):void 
{//出错处理 
Alert.show("sorry,出错了!!!"); 
} 
}

二,PHP服务器端
1,将amfphp文件夹置于MyTest项目的根目录下,打开浏览器输入下述地址验证amfphp是否安装成功
http://localhost/MyTest/amfphp/gateway.php

amfphp就是通过这个gateway来定位我们的服务类,并将请求转发给这些服务类进行处理的。
2,Login.php文件,包含了处理登陆请求的Login类,此文件置于BusinessLogic目录下
代码
<?php 
class Login 
{ 
public function doLogin($data) 
{ 
$result = array(); 
try { 
$name = array_shift($data); 
$pwd = array_shift($data); 
if ($name == "phinecos" && $pwd == "123") { 
$result[] = "1"; 
$result[] = "you are valid user!"; 
} else { 
$result[] = "0"; 
$result[] = "login failed"; 
} 
} catch (Exception $ex) { 
$result[] = "-1"; 
$result[] = $ex->getMessage(); 
} 
return $result; 
} 
} 
?>

3,将globals.php中的服务路径项修改如下,为amfphp指明服务类所在的目录
$servicesPath = "../BusinessLogic/";

作者:洞庭散人
AMFPHP 下载地址
PHP 相关文章推荐
一个oracle+PHP的查询的例子
Oct 09 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
linux下安装php的memcached客户端
Aug 03 PHP
php判断输入是否是纯数字,英文,汉字的方法
Mar 05 PHP
PHP判断手机是IOS还是Android
Dec 09 PHP
php常用图片处理类
Mar 16 PHP
PHP简单日历实现方法
Jul 20 PHP
PHP7匿名类的用法示例
Apr 05 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 PHP
PHP chmod 函数与批量修改文件目录权限
May 10 #PHP
php file_exists 检查文件或目录是否存在的函数
May 10 #PHP
php disk_free_space 返回目录可用空间
May 10 #PHP
PHP is_dir() 判断给定文件名是否是一个目录
May 10 #PHP
php is_file 判断给定文件名是否为一个正常的文件
May 10 #PHP
php下用cookie统计用户访问网页次数的代码
May 09 #PHP
简单的PHP留言本实例代码
May 09 #PHP
You might like
web方式ftp
2006/10/09 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP类的反射用法实例
2014/11/03 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
详解javascript高级定时器
2015/12/31 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
基于python 处理中文路径的终极解决方法
2018/04/12 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Python实现队列的方法示例小结【数组,链表】
2020/02/22 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
C#面试问题
2016/07/29 面试题
高中毕业生的个人自我评价
2014/02/21 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
客房服务员岗位职责
2015/02/09 职场文书
公司董事任命书
2015/09/21 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python