浏览模式: 标准 | 列表

这个版本目前实现了对各种基元类型、一维数组、多维数组、交错数组、ArrayList、Hashtable、和其它可序列化对象的序列化。实现了 PHP 5 中的 Serializable 接口的支持。实现了 PHP 中的 __sleep 和 __wakeup 魔术方法的支持。实现了对所有标示(N、b、i、d、s、a、O、R、r、U、C)的反序列化,在对标示 a 反序列化时,可以根据下标和值来自动判断是 ArrayList 还是 Hashtable。并且在反序列化时可以强制指定反序列化的类型。

该类是静态类,无需也不能被实例化。除了包含了 Serialize 和 UnSerialize 方法以外,还增加了一个 ChangeType 方法,用来进行反序列化后的类型转换,该方法比 Convert.ChangeType 方法的转换的能力更强。

» 阅读全文

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/

» 阅读全文

以前写 PHPRPC 实现时,JavaScript 版本的序列化实现是修改自 http://www.devpro.it/code/102.html 的,这个实现虽然目前仍然在更新,不过它并没有完全实现 PHP 序列化的所有标记,因此它无法序列化复杂对象,例如嵌套对象,也无法反序列化所有的 PHP 序列化以后的内容。因此我重新编写了一个实现,这个实现与 PHP 5 的序列化完全兼容,并且可以反序列化 PHP 4、PHP 5 和 PHP 6 序列化的内容。支持魔术方法 __sleep 和 __wakeup,支持实现了 Serializable 接口的序列化和反序列化(在 JavaScript 没有接口的概念,因此只要对象中包含 serialize 和 unserialize 方法就可以了,关于 Serializable 接口与自定义序列化的更多内容请参见:PHP 序列化(serialize)格式详解——自定义对象序列化)。该实现兼容以下版本的浏览器(已测试):

  • IE 4+(包括 Windows Vista 的 IE 7+ 与 Windows Mobile 2003/Windows Moblie 5 的 IE 4)
  • Netscape 6+
  • Mozilla/Firefox
  • Opera(包括 Opera Mini 和 Opera Mobile,但对于 Opera Mobile 8.5 beta 2 for Windows Mobile 5 Pocket PC 对象序列化时,对象名的序列化支持的不完整,而其他版本都正常。)
  • Konqueror
  • Safari
  • Epiphany

其他浏览器未测试,但应该基本上只要支持 JavaScript 的浏览器都可以支持(有条件的用户希望能够帮忙测试)。

» 阅读全文

同时安装这两个版本的 PHP,主要是为了测试程序。在 ubuntu 上安装 PHP 很简单,用 apt-get 一下子就安装好了。为了能同时测试 PHP4 和 PHP5 的程序,我安装了两个 apache,一个是 apache 1.3,另一个 apache 2,用 apache 1.3 跑 PHP4,用 apache 2 跑 PHP5,为了不让他们冲突,我把 apache2 的端口号改成了 81。安装非常简单:

sudo apt-get install apache2 libapache2-mod-php5 php5

这样就把 PHP 5 安装好了,之后修改 apache2 的端口号为 81,并重启该服务。然后安装 PHP4:

sudo apt-get install apache libapache-mod-php4 php4

如果安装好之后,apache 上不能运行 PHP 程序,可能是配置文件的问题,只要把 PHP4 的 apache 模块加载语句添加到 apache 的配置文件里就好了。

上面这些都很容易。下面该安装开发包了,我装这个东西主要是为了测试我写的 xxtea 的 PECL 扩展是否能在这两个版本的 PHP 上都编译通过。顺便安装一个 PHP 的 CLI 版。

sudo apt-get install php4-cli php4-dev
sudo apt-get install php5-cli php5-dev

执行上面两句之后,这两个版本的开发包和命令行版本也就都安装好了,不过有个问题,默认的 php、php-config 和 phpize 等程序的连接都是指向 PHP5 上的,也就是说如果你要编译 PHP 模块,它总是会用 PHP 5 的开发包来编译。所以,我写了一个切换 PHP 版本的脚本,用它可以很方便的在 PHP4 和 PHP 5 之间切换:

switchphp
#!/bin/sh
CURRENT_PWD=`pwd`
cd /etc/alternatives
sudo rm php*
sudo ln -s /usr/bin/php$1 php
sudo ln -s /usr/share/man/man1/php$1.1.gz php.1.gz
sudo ln -s /usr/bin/php-config$1 php-config
sudo ln -s /usr/share/man/man1/php-config$1.1.gz php-config.1.gz
sudo ln -s /usr/bin/phpize$1 phpize
sudo ln -s /usr/share/man/man1/phpize$1.1.gz phpize.1.gz
cd $CURRENT_PWD

下载以后,放在 /usr/bin 目录下,设置属性为 755,就可以了。使用它切换 PHP 版本时,只需要在命令后面跟上版本号就可以了。例如要切换到 PHP 4,只需要执行:

switchphp 4

就可以了。

» 阅读全文