浏览模式: 标准 | 列表

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

该版本已过期。

» 阅读全文

3月
14

Nusoap vs PHPRPC for PHP

因为看到有人问 Nusoap 和 PHPRPC 的比较,为了让大家能够更清楚地了解 Nusoap 和 PHPRPC 的关系,所以在这里做一个简要的说明性介绍,所写的内容也不是面面俱到的,只写了一些主要的比较。更多细节的比较大家可以在使用中自己来对比。

Nusoap 是一个用于 PHP 的 Web Service 实现。PHP 版本的 PHPRPC 协议实现跟 Nusoap 是一个级别的东西。但是 PHPRPC 协议是跟 Web Service 一个级别的东西,所以下面我们来把 Nusoap 实现跟 PHP 版本的 PHPRPC 协议实现进行比较,把 Web Service 和 PHPRPC 协议进行比较。

1、协议比较:

相同之处:

这两个协议都是基于 HTTP 协议的,都可以使用 POST 方法提交请求。

主要不同之处:

(1) 请求:WebService 虽然也支持 GET 方式提交请求,但是一般不常用,常用的方式是利用 POST 方法提交 SOAP 格式的请求。而 PHPRPC 支持 GET 和 POST 两种方式来提交请求,请求格式是最常见的 application/x-www-form-urlencoded 格式,这对于实现一个浏览器客户端来说更加容易。

(2) 响应:WebService 返回的响应是 SOAP 格式的数据,对于浏览器客户端来说,只有利用 XMLHttpRequest 才能够对其进行处理,因为 XMLHttpRequest 收到跨域调用的限制,因此 WebService 的浏览器客户端无法做到跨域调用服务。PHPRPC 的响应格式是兼容于 JavaScript 格式的纯文本,因此返回的响应可以直接作为脚本执行,因此实现浏览器客户端可以完全不依赖于 XMLHttpRequest,利用纯 JavaScript 即可实现一个浏览器客户端,而浏览器允许跨域下载并执行脚本,因此 PHPRPC 的浏览器客户端可以做到跨域调用。

(3) 数据交换格式:WebService 中所使用的 SOAP 格式是基于 XML 语言定义的,XML 语言是纯文本的,因为其中的某些位置可以增加或删除一些空白(空格、制表符、回车或换行)而不影响其所表示的内容,因此其格式可以整理成便于人来阅读的,但也由于这点的灵活性,对于机器处理来说效率偏低。而 PHPRPC 的数据交换格式是 PHP 序列化格式,PHP 序列化格式可以算是半纯文本的,因为其数据的表示格式也是采用人类可读的方式表示的,但其中任何位置都不可以插入多于的空白,它对机器的可读性作了很好的支持,不但提供了有效的分隔符,并且提供了字符串长度、数组元素个数、对象成员个数等信息,所以更有利于机器高速处理。因为协议本质上是机机语言,而不是计算机程序设计语言,计算机程序设计语言是人机语言,它应该更偏重于人类可读性,而机机语言应该更重视机器可读性。因此可以说 PHP 序列化格式在人类可读性和机器可读性之间做到了非常好的平衡。

(4) 带宽占用:WebService 是重量级的 Web 服务,其数据格式冗长拖沓,占用网络带宽高。PHPRPC 是轻量级的 Web 服务,其数据格式简单紧凑,占用网络带宽低。注意,这里所说到重量级和轻量级是指网络带宽占用,而不是指其提供服务的能力,PHPRPC 所提供的服务能力绝不逊色于 WebService,甚至在很多地方优于 WebService。打个比方说:WebService 就像是 OSI 的 7 层网络模型,看似完美,但实现复杂,使用困难。而 PHPRPC 则像是简化了的 TCP/IP 的 5 层网络模型,实现高效,使用方便。

2、然后我们再来比较 Nusoap 和 PHP 版本的 PHPRPC 协议实现:

相同之处是都用于 PHP。

不同之处主要在于易用性上,Nusoap 虽然在易用性上做的还算不错,但是跟 PHP 版本的 PHPRPC 协议实现来比较就差太远了。例如,利用 Nusoap 发布的服务函数需要单独编写,而不能使用跟本地函数同样的方式进行编写,更无法使用 PHP 中内置扩展的函数,而 PHPRPC 所发布的函数跟本地函数完全一样,甚至包括 PHP 内置扩展的函数也可以直接发布。要用 Nusoap 发布一个 wsdl,需要为每一个发布的过程的名称、参数名、参数类型、返回值类型、名空间、动作、样式、文档等内容进行定义。而要发布一个 PHPRPC 服务,只需要告诉服务器要发布的那个函数(也可以是对象方法或类方法)的名字(还可以给出别名)即可。而不需要给出参数名、参数类型、返回值类型等信息。因此对于变长参数,可变类型参数的支持更好。在 PHPRPC 客户端的使用上,也是同样的方便,可以直接以远程函数名命名的本地 PHPRPC 客户端的方法来调用远程函数,而 Nusoap 相对来说比较麻烦一些。PHPRPC 还有一个很大的优势在于,它可以让你很轻松的以安全加密传输的方式来进行远程调用,这一点 Nusoap 是做不到的。

» 阅读全文

Beta 3 Update:

修改了对 Session 的处理方法,在同一会话中可以支持多个客户端进行安全加密传输。
重新编写的纯 PHP 实现的大整数运算库,比原来的版本更加高效。
由于 gmp 在处理大整数运算时速度最快,对密钥交换时所使用的大整数运算的扩展设置为 gmp 优先,其次是 big_int、bcmath 扩展,最后是纯 PHP 实现的大整数运算库。

Beta 2 Update:

更加完善了对客户端发起的 Session 处理。
增加了对 Fatal 和 Compile 错误重定向到客户端的支持。
修正了原来对 PHP 反序列化未定义类时的错误处理。

Beta 1 Update:

实现了 PHPRPC 3.0 协议升级描述中的内容。
实现了 PHPRPC 3.0 for PHP Server API Draft 中的所有接口。
增加了对禁用 Cookie 的客户端的支持(3.0 客户端支持该功能)。
支持 PHP 4.2+ 和 PHP 5+。
增加对没有 bcmath、gmp 和 big_int 扩展的支持。
增加了对 PHP 5 的异常处理的支持。
增加了当客户端传递一个服务器端未定义的类的对象时,服务器端自动定义该类的支持。
与 PHPRPC 2.1、2.0、1.1 的客户端相兼容。

Download: phprpc_3.0_php_server_beta_3.zip

该版本已过期。

» 阅读全文

1月
15

对付 MySQL 的死连接

最近几天,学校的 MySQL 数据库总是出现许多死连接的情况,主要表现为有过多的 Sleep 连接,并且 Time 时间很长,占满了所有的可用连接数,以至于其它用户无法再连接数据库。我开始考虑调节 MySQL 数据库参数,但是改了许多参数仍然没有解决这个问题。于是想了一个比较狠的办法,写一个 php 脚本,每 2 分钟执行一次,发现死连接(超过 120 秒)就 Kill 掉,这样再也不会让某些程序搞死数据库服务器了,下面是 Kill 死连接的小程序:

kill-mysql-sleep-proc.php
<?php
define('MAX_SLEEP_TIME', 120);
 
$hostname = "localhost";
$username = "root";
$password = "password";
 
$connect = mysql_connect($hostname, $username, $password);
$result = mysql_query("SHOW PROCESSLIST", $connect);
while ($proc = mysql_fetch_assoc($result)) {
    
if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {
        @
mysql_query("KILL " . $proc["Id"], $connect);
    
}
}
mysql_close($connect);
?>

将它当中的 $password 改成你实际的数据库密码,死连接的时间也可以修改。然后加入计划任务就可以了。比如用 crontab -e 命令加入:

*/2 * * * * php /usr/local/sbin/kill-mysql-sleep-proc.php

就可以每隔 2 分钟检查并清除一次数据库中的死连接了。

» 阅读全文

XXTEA 算法很安全,而且非常快速,非常适合应用于 Web 开发中。但目前似乎很少有人将该算法用于实际开发中。甚至国内尚无介绍该算法的文章(至少在 Google 上搜索不到这方面的中文文章,关于密码学算法的书中也未见提及)。我在 Google 上搜索到了几个国外的 XXTEA 算法的实现(见参考文献),但基本上都是 JavaScript 的,但这些 JavaScript 实现也有一些问题,如果加密字符串长度不是 4 的整数倍,则这些实现的在加密后无法真正还原,还原以后的字符串实际上与原字符串不相等,而是后面多了一些 \0 的字符,或者少了一些 \0 的字符。

原因在于 XXTEA 算法只定义了如何对 32 位的信息块数组(实际上是 32 位无符号整数数组)进行加密,而并没有定义如何来将字符串编码为这种数组。而现有的实现中在将字符串编码为整数数组时,都丢失了字符串长度信息,因此还原出现了问题。另外单纯的 JavaScript 是没有意义的,因为单纯的客户端加密解密是不能有效保证信息的安全性的。因此我写了这个 JavaScript 和 PHP 实现,这两种实现在字符串编码上采用的算法是一致的,因此 JavaScript 加密的内容可以用 PHP 实现的解密算法进行解密,反之亦然。

2006年12月9日 更新

当解密失败时(如未使用正确的密钥),可以返回 null(JavaScript) 或 flase(PHP)。

2006年7月23日 更新

修正了当密钥不足 16 个字节时无法加密/解密的问题。

2006年6月27日 更新

修正了大多数 Linux 系统上 PHP 浮点数到整数转化不正常引起的加密解密不正确的问题。(十分感谢 lynk 和 lishouming 二位的帮助和测试!)

2006年3月7日 更新

修正了在 64 位机上不能正常工作的问题。(十分感谢 legend 大侠鼎力相助测试!)

JavaScript 版本的演示程序:http://test.coolcode.cn/xxtea/

» 阅读全文