“PHPRPC是一个轻型安全的,跨网际跨语言跨平台跨域,支持复杂对象传输,支持引用参数传递,支持内容输出重定向,支持分机错误处理,支持会话,面向服务的高性能远程过程调用协议”,提供了ASP,Java,JavaScript,.net,php,python,ruby,perl等主流语言的实现。
虽然soap也号称是简单对象访问协议,不过从上面一篇博客介绍中也看出,它的定义还是比较复杂了,更别提基于xml描述的wsdl文件,个人认为非常复杂难读。(对于两者的比较可以参考这篇博客介绍)
首先下载相应的语言包文件:http://phprpc.org/zh_CN/docs/ 我这里为了测试方便,下载的php版本,把压缩包解压到网站根目录。在根目录下创建两个测试文件server.php与client.php
<?php include ("php/phprpc_server.php"); function HelloWorld() { return 'Hello World!'; } $server = new PHPRPC_Server(); $server->add('HelloWorld'); $server->start(); ?>
<?php include ("php/phprpc_client.php"); $client = new PHPRPC_Client('http://127.0.0.1/server.php'); echo $client->HelloWorld(); ?>上面的案例都是phprpc官网上的例子,用浏览器访问http://127.0.0.1/client.php,如果出现500错误,可以再访问server.php试试,如果出现如下错误:
PHP Strict Standards: Non-static method PHPRPC_Server::initSession() should not be called statically in F:\asp\php\phprpc_server.php on line 495则修改phprpc_server.php文件里面initSession函数的类型为static即可。然后访问client.php就会看到熟悉的Hello World了,感觉比php_soap简单很多。
参数传递示例如下:
<?php include ("php/phprpc_server.php"); $server = new PHPRPC_Server(); $server->add('sort'); $server->start(); ?>
<?php include ("php/phprpc_client.php"); $client = new PHPRPC_Client('http://127.0.0.1/server.php'); $fruits = array("lemon", "orange", "banana", "apple"); $args = array(&$fruits, SORT_STRING); print_r($fruits); $client->invoke('sort', $args, true); print_r($fruits); ?>
既然是远程过程调用,不同语言不同平台和各种异构系统中都能很方便的实现互相调用,比如HelloWorld的例子,安装了asp的客户端后只需要在代码中添加如下代码,也能调用php的服务器端代码。
<%@ CodePage = 65001 %> <script runat="server" language="JScript" type="text/javascript" src="phprpc_client.js"></script> <script runat="server" language="VBScript"> Dim client Set client = PHPRPC_Client.create("http://127.0.0.1/server.php") Response.write(client.HelloWorld()) </script>关于PHPRPC的数据表示,加密传输,回话管理等内容可以详见:http://www.phprpc.org/zh_CN/docs/
此外还有facebook贡献的thrift项目做RPC通信也很方便,项目主页