PHPPRPC技术总结

1.简介:PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。 简单的理解其实就是:比较小的一个扩展插件,可以跨语言、跨平台进行加密传送数据,如java和php不同语言的数据传输

2.下载:http://www.phprpc.org/zh_CN/download/ PHPRPC 的 SVN 仓库地址为:https://php-rpc.svn.sourceforge.net/svnroot/php-rpc/phprpc_3.0/

3.示例:

服务器:

<?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();  //对远程方法(函数)的调用
?> 

4.PHPRPC for PHP 的安装

 该版本直接解压后就可以使用,其中  bigint.php  compat.php  phprpc_date.php  xxtea.php  属于公共文件。不论是客户端还是服务器端都需要这些文件。

 phprpc_client.php  是客户端文件,如果你只需要使用客户端,那么只要有上面那些公共文件和这个文件就可以使用了,使用时,直接在你的程序中包含 phprpc_client.php 就可以,公共文件不需要单独包含。

 dhparams  dhparams.php  phprpc_server.php  这三个文件是服务器端需要的文件。  其中 dhparams 目录中包含的是加密传输时用来生成密钥的参数  dhparams.php 是用来读取 dhparams 目录中文件的类。  phprpc_server.php 是服务器端,如果你要使用 PHP 来发布 PHPRPC 服务,只需要包含这个文件就可以了。公共文件和 dhparams.php 都不需要单独包含。

5.运行环境  PHP 4.3+、PHP 5、PHP 6  客户端要求开启 socket 扩展。  服务器端需要有 IIS、Apache、lighttpd 等可以运行 PHP 程序的 Web 服务器。  如果服务器端需要加密传输的能力,必须要保证 session 配置正确。

6.如果需要加密传输能力,最好开启大整数计算扩展,PHPRPC 支持的大整数计算扩展按照计算速度(由快到慢)排名是 gmp、big_int、bcmath。如果这些扩展你一个都没有开启,则密钥交换将使用 PHP 脚本来模拟大整数运算,这并不影响加密传输的功能,只是速度会慢一些。

7.如果你需要更快的加密处理能力,除了开启上面所说的大整数计算扩展以外,你还可以下载并安装 xxtea 的 PECL 扩展,该扩展采用 C 编写,它能够有效的提高加密速度。

8.PECL 版本的 xxtea 扩展安装方法

安装方法有多种,下面介绍最常用的三种安装方法: 跟 PHP 一同编译安装 使用 phpize 工具编译安装 在 Windows 下使用 Microsoft Visual C(.NET 或 6.0)编译安装

方法一:跟 PHP 一同编译安装  在 PHP 源码文件夹下创建 ext/xxtea 文件夹,将所有文件复制到新创建的文件夹下。  运行 ./buildconf 重新构建 PHP 的配置脚本。  带选项编译 PHP:--enable-xxtea 将作为 PHP 内置模块编译,--enable-xxtea=shared 将作为动态载入模块编译。

方法二:使用 phpize 工具编译安装  解压缩该包内容。  运行 phpize 脚本,为编译 XXTEA 包准备环境。  运行 ./configure --enable-xxtea=shared 生成 makefile。  运行 make 编译 XXTEA 扩展库,它将被放置在 ./modules 文件夹下。  运行 make install 安装 XXTEA 扩展库到 PHP。

方法三:在 Windows 下使用 Microsoft Visual C(.NET 或 6.0)编译安装  在 PHP 源码文件夹下创建 ext/xxtea 文件夹,将所有文件复制到新创建的文件夹下。  从你所使用的版本的 PHP 文件夹下复制 php4ts.lib(PHP 4 使用)或 php5ts.lib(PHP 5 使用)静态库到 ext/xxtea 文件夹下。  打开 php_xxtea.sln(MS VC.NET 的解决方案文件)或者 php_xxtea.dsw(MS VC 6.0 的工作环境文件)。尝试编译 Release_php4 (PHP 4 使用) 或 Release_php5(PHP 5 使用)配置。  从 ext/xxtea/Release_php4 或 ext/xxtea/Release_php5 下复制 php_xxtea.dll 到你所使用的 PHP 扩展文件夹下。扩展文件夹的路径在 php.ini 中可以找到。  在 php.ini 中添加这一行 extension=php_xxtea.dll

9.了解: PHPRPC 协议概述

 PHPRPC 是一个的远程过程调用协议。  PHPRPC 3.0 是使用 HTTP 协议作为传输协议的。  PHPRPC 仅使用 HTTP 的 GET 和 POST 两种请求方式。  PHPRPC 推荐的请求方式是 POST,仅在无法使用 POST 进行请求操作时,才应该考虑使用 GET。  远程过程调用中,参数和返回结果是通过 PHP 序列化形式表示的。

 响应的格式采用纯文本,所以服务器可以设置响应的 Content-Type 为 text/plain,并设置明确的字符集。

PHPRPC 数据表示

序列化与编码

 要想将这些数据通过网络传输,就需要将它们序列化为一个文本或者字节流。序列化的方式多种多样,比如 XML 方式1,JSON 方式,二进制字节流形式2。

 PHPRPC 采用的序列化方式是 PHP 序列化。

 PHPRPC 是以 HTTP 协议作为底层传输协议并且以 application/x-www-form-urlencoded 格式提交请求的,而传输的内容在序列化甚至再加密之后将会包含有很多需要 urlencode 的特殊字符,这样编码之后的长度将会增加 2 - 3 倍,并且还可能因为字符集的问题,造成在服务器无法正确解析。因此,我们在进行 urlencode 之前,先对序列化或加密后的数据进行 Base64 编码,然后再将 Base64 编码之后的数据中的 + 替换为 %2B 即可完成 urlencode。经过这种变化后,长度仅增加 1/3,并且可以避免字符集引起的解析问题。

 同样为了避免因为字符集而可能引起的对序列化数据中二进制字符串和加密内容解析错误,对于响应中的需要序列化或加密的内容,我们也要做 Base64 编码。

posted @ 2016-03-01 09:38  火狼神  阅读(422)  评论(0编辑  收藏  举报