今天需要把我们的代码部署到别人的服务器上,在Linux上尝试使用php_screw这个扩展加密了一下源代码,相当不错。
为了能在我的机器上把代码加密之后再部署到对方的Linux主机上去,晚上编译了一个Windows 二进制版本。总的来说,尝试过它的Windows版本之后,我对这个家伙的严谨性表示了严重的怀疑。他写这一坨代码的时候,完全没有考虑Windows的兼容性。
例如:php_screw.c 文件第 57 行明显的语法错误,在这里作者的意图应该是申明一个名为 org_compile_file 的函数指针类型的变量,结果他偏偏在前面加了 ZEND_API (__declspec(dllexport)) 【这个变量没必要导出】。同样,下面的 59行:
zend_op_array *pm9screw_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
这里也不应该加上 ZEND_API【函数实现】
同样,第80 行、第 86 行,没有考虑多线程安全的问题,还要加上 TSRMLS_CC:
return org_compile_file(file_handle, type TSRMLS_CC);
当然,除此之外,其它的细节问题就没了,除了常见的 PHP5.3之后的兼容性问题。
最可气的是,这个扩展居然在支持源代码换行格式为 Windows 时存在问题(换行为 \r\n),源代码的换行必须为 (\n) ,您的源代码千万不要是用记事本写的啊,如果是Editplus 写的,马上把文件格式改为 UNIX 吧(在测试这个时候花了最多的时间才试出来)。
下面提供一下针对 PHP5.3.6 、线程安全、VC9 和 VC6 的扩展和加密工具(真实的编译器是 VC9,如果跑不起来,请安装 VC9的运行时)【加密、解密的key是默认的,请注意部署目标机器的key】:
The Binary Below Compiled With the default pm9screw_mycryptkey in file my_screw.h.
http://www.1000li.com/php_dll/php_screw_vc6.dll Binary Release Of PHP_Screw For PHP5.3.6,TS,VC6
http://www.1000li.com/php_dll/php_screw_vc9.dll Binary Release Of PHP_Screw For PHP5.3.6, TS, VC9
http://www.1000li.com/php_dll/screw.exe Binary Relase Of Screw Encoding Tool
使用 screw.exe php源代码文件名 可以加密文件,加密的文件可以部署在有 php_screw.dll 扩展的服务器上。加密是透明的,无需任何处理(实际上,看 screw的源代码,其实就是非常朴素的处理了一下)