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 相关文章推荐
一个odbc连mssql分页的类
Oct 09 PHP
我的论坛源代码(八)
Oct 09 PHP
用PHP实现图象锐化代码
Jun 14 PHP
php将时间差转换为字符串提示
Sep 07 PHP
PHP中的按位与和按位或操作示例
Jan 27 PHP
PHP实现通用alert函数的方法
Mar 11 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
php+ajax无刷新上传图片实例代码
Nov 17 PHP
php session 写入数据库
Feb 13 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
php array_reverse 以相反的顺序返回数组实例代码
Apr 11 PHP
PHP hebrev()函数用法讲解
Feb 21 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
一些PHP写的小东西
2006/12/06 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
python使用cPickle模块序列化实例
2014/09/25 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
python中温度单位转换的实例方法
2020/12/27 Python
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
街道务虚会发言材料
2014/10/20 职场文书
财务工作失职检讨书
2014/11/21 职场文书
感谢信范文大全
2015/01/23 职场文书
民事代理词范文
2015/05/25 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
vue实现简易音乐播放器
2022/08/14 Vue.js