星期五, 四月 30, 2004

win2000 & PHP tip

win2000下有些进程不能用任务管理器杀死,可以用这个命令来做到:
ntsd -p pid -c "q"

PHP中的函数str_pos用来查找子串, 找不到时返回false, 找到的话返回子串的位置, 但如果用下面的语句判断是否没有找到是错误的:
if (!str_pos($a, $b))
因为如果子串位置恰好为0, 那么上面的if语句依然成立, 正确的做法是:
if (str_pos($a, $b) === false)
注意要用三个等于号!

星期六, 四月 24, 2004

使用php做html文件内容搜索

php在文件处理和字符串处理方面是非常方便的, 看下面的这个例子, 可以将html文件内容全部读入,并剥除其中所有的与内容无关的HTML标签, 再将结果放入一个字符串, 使用php一句话就可以做到了:
$file_text = strip_tags(join('',file($filename)))
这时再做文件内容搜索应该很简单了...

星期四, 四月 22, 2004

php的调试

php的代码是很难调试的,我以前就是用EditPlus+IE来做php代码的编写与调试(相信很多人都是这么用的), 可毕竟只能对付一些小程序,或者用来稍微修改一下OpenSource的代码,如果是需要开发较多的功能,相信只用IE来调试是极其低效的。
有一些php的调试器甚至是集成开发环境可用,可惜的是IDE大多不是Free的,我用过PhpEd,PhpEd是一个PHP的集成开发环境,目前的版本是3.3,可以很好的支持php的开发,集成有智能编辑器,GUI调试器,帮助系统,完善的界面看起来像是Visual studio的PHP版。 :)
PhpEd支持三种php程序的调试方式,Local CGI mode最简单,相当于直接调试php.exe,与web server无关,那么这只能应付一些最简单的php script,HTTP mode (SRV local WEB server)使用phpEd自带的web server进行调试,通常这种方式可以应付绝大多数的script,设置简单,并且效果很好。但有些script对server端环境要求"极其苛刻 ", 这时只能使用最后一种调试方式-HTTP mode (remote WEB server),由于使用了真正的web server,这是一种完全仿真的调试,几乎可以应付所有的php程序,但需要事先建立工程,并设置script的路径映射关系,还需要在web server的php设置(通常在php.ini)中,打开debug extension的支持,并根据php版本将合适的php_dbg.dll拷贝的windows目录下。
对我来说,PhpEd有个致命的缺点: 不支持中文, 不只是它的编辑器不能很好的编辑中文, 在用PhpEd调试时, 如果某个字符串变量或数组的值含有中文, 你就不能看到这个变量,数组的确切内容. :(

星期四, 四月 15, 2004

ccache under cygwin

在应用ccache时,发现一个问题,在某些人的PC上,ccache的编译结果居然是错误的!开始我怀疑是不是在用ccache前后所调用的编译器不同所致,后来用objdum来查看ccache编译的.o文件,推翻了我的猜测,因为ccache编译出的.o文件格式都不对,显然不是正常编译器编译出来的结果,但在某些PC上使用ccache编译却又是正确的。
偶然的发现ccache放在缓存里的hash文件全部是正确的!而这些hash文件正是ccache调用真正的编译器编译出来的,可见编译器这个环节都没有问题,接下来问题会出在哪里?
下载了ccache的源码,分析源码,可以看出,ccache在调用编译器时会把编译结果直接定位到cache目录,而在编译前后都会试着从cache目录拷贝对应的hash文件到最终的目标文件,难道拷贝出错了? 拷贝是用的一个简单的函数,非常的简单,循环拷贝10K数据放到目标文件,直至结束。
既然问题出在拷贝上,我开始比较两个不同的目标文件,一个是用ccache编译出的,一个是直接用编译器编译出的,很直观的看出,真正编译出的目标文件中的所有0A到了ccache的结果中变成了0D 0A, 问题非常清楚了,就是因为Dos文件到Unix文件转换在作鬼,而这个转换一定是cygwin的内核cygwin1.dll做的,但是问题又来了,不同的 PC上,我用的都是同一个版本的cygwin1.dll,怎么会有不同的转换效果呢?
上网去查询了一下,终于明白,cygwin1.dll会在注册表里搜索关于磁盘mount的一些选项,其中非常重要的一个选项是按text还是 binary方式mount文件系统,不同之处就在这里,我把ccache工作正常的机器上的HKLM\software\cygnus Solutions\Cygwin\mounts v2和HKCU\software\cygnus Solutions\Cygwin\mounts v2两个分支导出到其他PC,所有PC上的ccache都工作正常了。实际上控制mount方式的KEY就是上述分支中的cygdrive flags选项,如果是0x22就是binary方式,0x20则是text方式。

星期二, 四月 13, 2004

减少编译时间

有两个非常有效的方法可以提高编译速度:
1) 不该编译的文件不要编译
2) 一定需要编译的文件通过分布式工具做编译

第一点看起来很简单,却非常非常有效,尤其对于大型的项目,在完全重编译时,其实很多文件并没有改动,这些文件的重编译会浪费很多时间,有效的方法是在每 次编译时计算源文件的hash值和编译结果,下次做重编译时则根据hash值来决定是否需要真正编译,这里hash算法非常重要,因为一旦发生hash冲 突,则可能返回错误的编译结果。所以这里的hash算法绝不能选用校验和这样的简单算法,可以选用MD5这样的高强度算法。

ccache就是这样的工具,在编译时它会用MD4算法计算hash 值,并和编译结果缓存在预先设置的目录下(可以通过环境变量来设置这个缓存目录),每次重编译时,都可以使用原先的缓存大幅提高编译速度,我测试的结果, 在win32平台和GNU的编译工具链下,使用cygwin编译的ccache后,在源文件没有改变的情况下,重编译时间缩短60%。

对于第二种方法,分布式编译,则是通过分布在网络中的多台计算机的分布计算,真正提高编译速度。这比上一种方法要复杂的多,相应的成熟的工具也比较少,GNU环境下有一个著名的软件distcc, 就是这样的分布式编译工具。我在win32平台下用过distcc,可惜比较复杂(因为distcc设计是在*nix环境下使用的)。 在服务器端(就是替其他编译者编译)需要运行distccd,在客户端(发起编译者)则需要通过gnu make的多任务特性(--jobs参数)和运行distcc来达到分布编译的目的。我测试的结果,使用4台计算机,可以将编译时间缩短一半左右。

上面两种手段可以联合使用,进一步提高编译速度。所以ccache和distcc通常会在一起运行,可谓黄金搭档。 :)

星期三, 四月 07, 2004

php代码索引

我通常会在HotScriptsThe PHP Resource Index来查找想要的PHP代码,这两个网站都按类别收集了大量的PHP应用,并且大部分是Free的。除了代码的基本特性外,两个网站都提供了很有价值的用户评价系统,可供参考。
不过虽然这样的网站提供了大量的可参考的代码索引(比如hotscripts可索引到7000多种PHP应用),但仍然不能包含所有有价值的PHP应用,仍然有很多PHP应用没有被索引,由此也可以看出PHP的开放与成功。