在PHPRPC官网上它是这样描述的:
PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。
——————————————————————修改———————————————————–
直接用PHPRPC官网上下载下来的PHPRPC for PHP 可能有些问题,需要做一些修改:
首先打开phprpc_server.php文件,看到最后一行是这样写的:
1PHPRPC_Server::initSession();
但查看源代码会发现initSession()方法并没有定义为静态方法,所以要手动加上static,在413行左右。
然后就是打开compat.php文件,看到里面有个gzdecode()方法的定义,在高的PHP版本中,已经引入这个方法,所以就会出现重复定义的致命错误。
解决方法就是用:if (!function_exists(‘gzdecode’)) {}把它包裹起来即可。
——————————————————————————————————————————–
PHPRPC用起来确实简单,而且还支持javascript调用,简直就是一个加强版的可跨域版的AJAX,直接上代码,注释已经写的很详细了。
服务器端:server.php
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465<?php
/**
* Created by SublimeText2.
* User:JAE
* Date: 2013-12-28
* Blog: http://blog.jaekj.com
* QQ:734708094
* PHPRPC服务端演示
*/
include ("../phprpc_server.php");
function inc($v)
{
echo "做自增操作";
return $v++;
}
function sub(&$v)
{
echo "做自减操作";
$v--;
}
class MyClass
{
var $v;
function __construct($value)
{
$this->v = $value;
}
public function setV($value)
{
$this->v .= $value;
}
public function getV()
{
return $this->v;
}
static function inc($value)
{
echo "类的静态方法";
return $value+2;
}
}
//由于客户端每一次的请求,服务端都会重新加载,
//所以对于对象操作,可以存放到session里面,
//以保证所有方法的操作都是针对同一个对象的
//注意:这里一定要用if判断,否则session会被覆盖
if (!$_SESSION['obj']) {
$_SESSION['obj'] = new MyClass('自定义类');
}
//Server主要方法:add($functions, $obj = NULL, $aliases = NULL)
//参数:字符串|数组|对象 字符串|对象 重命名
$server = new PHPRPC_Server();
//发布inc()函数
$server->add('inc');
//发布sub()函数,并重命名为subt()
$server->add('sub',NULL,'subt');
//发布MyClass类对象的两个方法,可以用数组的形式同时发布多个方法
$server->add(array('setV','getV'),$_SESSION['obj']);
//发布MyClass类的静态方法inc(),由于与刚才以发布的inc()重名了,所以这里重命名为inc2()
$server->add('inc','MyClass',"inc2");
//可以像下面那样直接add一个对象
//$server->add($_SESSION['obj']);
//还可以发布PHP系统函数
$server->add(array("md5","base64_encode","sha1"));
$server->start();
?>
客户端:client.php
1234567891011121314151617181920212223242526272829303132<?php
/**
* Created by SublimeText2.
* User:JAE
* Date: 2013-12-28
* Blog: http://blog.jaekj.com
* QQ:734708094
* PHPRPC客户端演示
*/
include ("../phprpc_client.php");
$client = new PHPRPC_Client(' http://127.0.0.1/MySite/phprpc_3.0.1_php/demo/server.php');
$client->setV("MyClass");
echo $client->getV()."<br/>";
$i =10;
echo $client->inc($i);
//输出重定向
echo $client->getOutput()."<br/>";
//服务端在这里把类的inc静态方法重命名成inc2了
echo $client->inc2($i);
echo $client->getOutput()."<br/>";
//数组里面存放要要传递的参数
$arr = array(&$i);
//主意服务端这里发布的时候把sub重命名成subt了
//第二个参数是引用,所以一定要是个变量
//第三个参数true表示开启按引用传值
$client->invoke('subt',$arr,true);
echo $i;
echo $client->getOutput()."<br/>";
//调用PHP的系统函数
echo "md5:".$client->md5('admin')."<br/>";
echo "base64:".$client->base64_encode('admin')."<br/>";
echo "sha1:".$client->sha1('admin');
运行结果:
javascript客户端演示:client.html
123456789101112131415161718192021222324252627282930313233343536373839404142<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PHPRPC客户端演示</title>
<script type="text/javascript" src="phprpc_3.0.1_js/compressed/phprpc_client.js"></script>
<script type="text/javascript">
//声明要使用的函数
var fun = ['inc','subt','setV','getV','md5'];
var client = new PHPRPC_Client(' http://127.0.0.1/MySite/phprpc_3.0.1_php/demo/server.php',fun);
//设置密钥长度(可选)
client.setKeyLength(256);
//设置加密类型(可选)
client.setEncryptMode(3);
function test () {
//前面的参数为原函数的参数,最后一个参数为回调函数,
//回调函数参数依次为:
//第一个参数 result 是服务器端方法(函数)的返回值,它可以是任意类型。
//第二个参数 args 是方法调用的参数,如果这个调用是一个引用参数传递的调用,参数也有可能被修改,这时候,你可以通过 args 来获得修改后的参数,关于引用参数传递的调用我们后面会做进一步说明。
//第三个参数 output 是服务器端输出的内容,它是字符串类型的。
//第四个参数 warning 是服务器端发生的警告错误(目前只有 PHP 服务器会产生警告错误),一般只调试过程中可能会用到。
//使用PHP的MD5函数
client.md5("admin",function (result, args, output, warning){
alert("md5:"+result);
});
var i = 10;
//引用传参,最后一个参数设为true即可
client.subt(i,function (result, args, output, warning){
alert(args[0]+" "+output);
},true);
client.setV("MyClass",function(){});
client.getV(function (result, args, output, warning){
alert(result);
});
}
</script>
</head>
<body>
<input type="button" value="测试" onclick="test()">
</body>
</html>