浏览模式: 标准 | 列表

因为 PHPRPC 的 QQ 群已经接近满员,最近关注 PHPRPC 的用户也越来越多,因此,在 PHPRPC 网站上专门开了一个技术交流论坛,欢迎大家参与讨论!地址是:http://www.phprpc.org/forum

以后,关于 PHPRPC 最新信息的发布,会在论坛里第一时间出现,而 CoolCode.CN 将只作为 PHPRPC 的公共信息的发布点,而更多更全更详细的信息将只在论坛发布。

» 阅读全文

在 PHPRPC 3.0 for javascript 客户端中,关于跨域调用的使用,跟非跨域调用没有区别。只要在客户端中使用跨域服务器的绝对地址就可以了。例如上一节中的例子,如果其中客户端初始化语句改为:

var rpc = new PHPRPC_Client('http://www.phprpc.org/samples/sha1.php', ['sha1']);

,并且客户端网页与该网站不在同一个域中的话,那么它就会自动转为跨域调用模式。而服务器端不需要做任何特殊设置。

但跨域调用在 PHPRPC 中是如何实现的呢?

» 阅读全文

本教程不打算写成一份面面俱到但枯燥无味的 API 手册,而是要把 PHPRPC 中从最基本的用法到高级的应用技巧,以生动活泼的实例展示给大家。

如果你对 PHPRPC 感兴趣的话,那么我们就开始 PHPRPC 之旅吧!

大部分 ajax 框架都很庞大,不但处理传输,而且更多的工作是负责显示的处理,更有甚者,还要用服务器端程序生成客户端的 JavaScript,或者把客户端 JavaScript 本身改造一番。

PHPRPC 与其它 ajax 框架不同,PHPRPC 遵循的是“只做一件事,并把它做好”的原则。它只负责数据传输,并且将传输做到最好!它将你以前用传统的 ajax 方式做不到或者很难做到的事情变得轻而易举!

相信好多人选择 PHPRPC 的一个主要原因就是它能够让你开发 ajax 应用变得更加容易!尽管 PHPRPC 的强大之处不仅限于此,但我不得不承认,这确实是 PHPRPC 的一大亮点! 

所以,我们的第一站,就来看看如何用 PHPRPC 3.0 来编写 ajax 应用吧。

» 阅读全文

原创作品,转载请注明出处。

PHPRPC 3.0 协议的升级主要在于完善 PHPRPC 协议安全性的设计。增加了对输出捕获的加密支持,另外,增加了密钥交换时密钥长度的选项。

在 2.0 和 2.1 协议中,在远程过程调用阶段的请求中的 phprpc_encrypt 参数用来指定加密模式,该参数在 3.0 协议中增加了 3 这个取值,该取值表示除了 phprpc_args 参数和应答中的 phprpc_result 加密以外,应答中的 phprpc_output 也要经过加密处理。

在 2.0 和 2.1 协议中,没有规定密钥交换的长度,所以密钥交换时密钥长度不同的两个实现是无法正常通讯的。但是目前所有的 2.0 和 2.1 实现中,都是按照 128 位的密钥长度进行编写的,因此它们目前没有遇到这种问题。但为了允许更长的密钥交换,并且可以兼容已有的实现。在 PHPRPC 3.0 协议中,增加了 phprpc_keylen 选项。对于该选项的描述如下:

当客户端发起密钥交换请求时,可以带有 phprpc_keylen 参数,该参数值表示密钥交换的位数。例如:

phprpc_keylen=512

如果服务器支持客户端所指定的位数,则进行密钥交换时,在响应中返回相同的参数,但格式按照响应的格式返回,例如:

phprpc_keylen="512";

如果服务器端不支持客户端所指定的位数,则选择支持的最接近客户端所指定的位数进行密钥交换,并且在响应中给出实际的位数,例如:

phprpc_keylen="160";

如果服务器端使用 128 位来进行密钥交换,则响应中可以不给出密钥交换的位数,客户端也应该按照 128 位来进行处理。

该响应参数与 phprpc_encrypt 响应参数都只在密钥交换第一阶段出现。

注意,以前版本的 PHPRPC 协议,phprpc_encrypt 在密钥交换的第二阶段返回一个序列化的 boolean 值 true,但因为该值从来没有被使用过,故而在 3.0 版本中取消该响应。

另外,在密钥交换阶段,不再返回 phprpc_functions 的响应。这样做的目的是为了进一步减少带宽占用。但可能会与早期的 2.0、2.1 版本的某些 JavaScript 客户端实现在加密传输处理上不兼容,但这种兼容性是与协议实现有关的,与 2.0、2.1 版本协议仍然是兼容的。

由于协议的以上变动,因此在密钥交换的第二阶段仅输出请求中 phprpc_callback 参数的值(如果存在的话)。早期的协议对于响应中各个参数的顺序,是有定义的,这样做是为了方便客户端实现。但建议新的客户端在实现时不要过于依赖相应参数的顺序。但对于新的服务器来说,仍然建议按照早期定义的顺序输出响应参数。另外需要强调,请求中 phprpc_callback 参数的值一定要作为响应中的最后一项输出。

为了使 PHPRPC 的浏览器客户端在禁用 cookie 的情况下仍然能够进行密钥交换和加密传输,建议服务器在密钥交换的第一阶段,如果检测到客户端可能不支持基于 cookie 的会话(例如可以检测建立的是否是一个新的会话)时,在输出密钥交换参数(phprpc_encrypt)和密钥长度(phprpc_keylen)选项后,增加一项输出 phprpc_url,例如:

phprpc_url="http://localhost:8080/test/test.jsp;jsessionid=896CE4204292E70D28D27FE7C4503232";

其中 phprpc_url 的值是在原服务地址上增加了服务器会话标示(session id)的地址。会话标示的附加方式由服务器端根据实际情况来决定,如果原客户端地址本身带有 url 请求参数,应该保留原有参数。例如,如果原服务器地址为 http://localhost:8080/test/test.jsp?serverid=2342&action=do,则响应中的 phprpc_url 应为如下格式:

phprpc_url="http://localhost:8080/test/test.jsp;jsessionid=896CE4204292E70D28D27FE7C4503232?serverid=2342&action=do";

服务器仅应该过滤掉请求地址中以 phprpc_ 开头的请求参数。另外,该值的编码方式与 phprpc_errstr 的编码方式相同,即根据请求中 phprpc_encode 的值来决定进行 base64 编码还是 javascript 字符串格式编码。该响应仅在密钥交换的第一阶段返回。

客户端在收到该响应后,应使用该服务地址替换原来的服务地址。之后所有的调用(包括密钥交换第二阶段)都使用新的地址,从而实现在无 cookie 的情况下,仍然可以使会话一直保持下去,保证密钥交换和加密传输顺利进行。

在 2.0 和 2.1 协议中,没有规定加密算法,但目前的实现所使用的加密算法都是 XXTEA 加密算法。为了保证所有的实现都能够兼容,因此,在 PHPRPC 3.0 中,规定加密应使用 XXTEA 加密算法。

XXTEA 加密算法的密钥长度为 128 位,如果密钥交换采用的是 128 位(默认)密钥,则交换后的密钥直接用于 XXTEA 加密算法。其它长度的密钥需要用 MD5 算法生成 128 位密钥(在对非 128 位密钥进行 MD5 时,是对其 10 进制表示的数字字符串进行 MD5,而非其它形式),然后再用于 XXTEA 加密算法中。

为了避免同一个页面上的多个 JavaScript 客户端在与同一个服务器进行密钥交换时产生冲突,故在请求中增加了一个参数: phprpc_id,该参数的值由客户端生成,用于唯一标示该客户端。服务器端根据该值来区别同一会话中的多个客户端。该参数仅用于 JavaScript 客户端。

服务器端如果对字符集进行解释(例如 Java、.NET 等双字节字符编码的语言实现的服务器),不论对客户端提交的请求,还是对输出的响应,都按照服务器端设置的字符集进行解释。客户端的请求中可以包含字符集设置,但是应该与服务器端设置相同,在与服务器端设置不同的情况下,按照服务器端设置的字符集进行处理。建议统一使用 UTF-8 字符集,在此种情况下,可以保证所有服务器与客户端正常通讯,如设置其它字符集,只能保证两个相同字符集设置的服务器和客户端可以正常通讯。

原创作品,转载请注明出处。

» 阅读全文

Beta 3 Update:

修正了当响应内容较多时,无法全部读取的 bug。

Beta 2 Update:

增加了对 Keep-Alive 的支持,在同一会话中进行多次服务调用时更加高效。
重新编写的纯 PHP 实现的大整数运算库,比原来的版本更加高效。
由于 gmp 在处理大整数运算时速度最快,对密钥交换时所使用的大整数运算的扩展设置为 gmp 优先,其次是 big_int、bcmath 扩展,最后是纯 PHP 实现的大整数运算库。

Beta 1 Update:

实现了 PHPRPC 3.0 协议升级描述中的内容。
实现了 PHPRPC 3.0 for PHP Client API Draft 中的所有接口。
支持 PHP 4.2+ 和 PHP 5+。
增加对没有 bcmath、gmp 和 big_int 扩展的支持。
增加了对 PHP 5 的异常处理的支持。
增加了反序列化未定义类的对象的特殊处理。
与 PHPRPC 2.1、2.0、1.1 的服务器相兼容。

Download: phprpc_3.0_php_client_beta_3.zip

该版本已过期。

» 阅读全文