浏览模式: 标准 | 列表
8月
21

XXTEA 的 PECL 扩展

前面在 XXTEA 加密算法的 JavaScript 和 PHP 实现 一文里,我已经给出了 XXTEA 算法的纯 PHP 实现,但是因为 PHP 本身的原因,该纯 PHP 版本的速度相对来说还比较慢,不适合处理大量的数据。为了提高速度,我用 C 编写了这个 XXTEA 的 PECL 扩展,该扩展已在 Windows IIS + PHP 5.1.4 和 Ubuntu 6.06 + PHP 5.1.2 下编译调试通过,在其它版本的 PHP 上也可以编译。速度非常快。

下载:xxtea-1.0.3.zip

» 阅读全文

这个版本目前实现了对各种基本类型、数组、ArrayList、HashMap、和其它可序列化对象的序列化。实现了 PHP 5 中的 Serializable 接口的支持。实现了 PHP 中的 __sleep 和 __wakeup 魔术方法的支持。实现了对所有标示(N、b、i、d、s、a、O、R、r、U、C)的反序列化,在对标示 a 反序列化时,可以根据下标和值来自动判断是 ArrayList 还是 HashMap。并且在反序列化时可以强制指定反序列化的类型。 该类是静态类,无需也不能被实例化。除了包含了 serialize 和 unserialize 方法以外,还增加了一个 cast 方法,用来进行反序列化后的类型转换,该方法主要用于将反序列化后的 ArrayList 转化为数组或者 HashMap。 该类在 J2SE SDK 1.3.1 和更高版本上编译通过,更低版本的未做测试。

» 阅读全文

PHPRPC Agent Generator for .NET 是 PHPRPC for .NET 的一个辅助工具,它可以帮你自动生成 PHPRPC 代理类,然后你可以直接使用该代理类来与服务器端进行通讯。它的作用相当于 .NET 中 Web Service 的 wsdl.exe 工具,不同的是,wsdl.exe 创建的是 Web 服务的代理类,而 pag.exe 创建的是 PHPRPC 的代理类。目前的 pag.exe 创建的代理类使用的是 C# 语言。自动生成的代理类中的方法,返回结果都是 object 类型,在程序中,使用时,可以通过 PHPSerializer.ChangeType 方法来转化为实际的返回类型,PHPSerializer.ChangeType 功能比 Convert.ChangeType 功能更强,它可以把返回值转化为实际的类型。而 Convert.ChangeType 在转化数组等类型时,可能会出现问题。这里使用 object 类型作为返回值类型是为了保证返回值可以是任何类型,以便于弱类型语言的服务器端进行通讯。

» 阅读全文

7月
01

在 IIS 7 上配置 PHP

6 月 27 日,微软发布了 Virtual Machine Additions for Vista Beta 2,我将其安装在 Virutal Server 2005 R2 SP1 Beta 1 上之后,终于可以玩 IIS 7 了。在安装这个版本的 VM Additions 之前,我的 Longhorn Server Beta 2 虚拟机一直用的是 for Windows 2003 的 VM Additions,那个速度别提有多慢了。装了这个版本以后,在给 Longhorn Server Beta 2 虚拟机分了 480M 内存的情况下,速度飞快,感觉棒极了!于是终于开始了 IIS 7 之旅。

作为一个 PHP 玩家,在有 IIS 7 可用之后,第一个想法自然是给 PHP 在 IIS 7 上安一个家。下面就是我的全部安装过程图解。

» 阅读全文

6月
08

用 PHP 实现下载

下面这段程序是我从我最近写的一个系统里摘出来的,可以实现重命名下载文件(包括中文名)。 function is_ie() { $useragent = strtolower($_SERVER['HTTP_USER_AGENT']); if ((strpos($useragent, 'opera') !== false) || (strpos($useragent, 'konqueror') !== false)) return false; if (strpos($useragent, 'msie ') !== false) return true; return false; } function download($attachment) { $realpath = ABSPATH . UPLOAD_DIR . '/' . $attachment['path'] . '/' . $attachment['savename']; $content_len = sprintf("%u", filesize($realpath)); if (is_ie()) { // leave $filename alone so it can be accessed via the hook below as expected. $filename = rawurlencode($attachment['filename']); } else { $filename = &$attachment['filename']; } while(ob_get_length() !== false) @ob_end_clean(); header('Pragma: public'); header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: pre-check=0, post-check=0, max-age=0'); header('Content-Transfer-Encoding: binary'); header('Content-Encoding: none'); header('Content-type: ' . $attachment['type']); header('Content-Disposition: attachment; filename="' . $filename . '"'); header("Content-length: $content_len"); echo file_get_contents($realpath); exit(); } 其中 $attachment 是附件相关信息的一个关联数组。ABSPATH 是系统路径,UPLOAD_DIR 是上传目录的路径(这里就是从上传目录取文件,然后提供给用户下载,而上传目录本身是没有读权限的,这样就可以保证用户无法直接下载到没有权限访问的文件了),这两个常量都是自己定义的,不是系统的。

» 阅读全文