PHPRPC入门实例

来源:互联网 发布:知行劳务 编辑:程序博客网 时间:2024/06/15 14:04
在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>

0 0
原创粉丝点击