Fastest Web Server – Cherokee

在汽车世界中,形象憨厚的大切(Grand Cherokee)肯定不是跑得最快的车。而在强手如林的 Web 服务器领域,新锐 Cherokee 却号称是当前最快的 Web 服务器,悍然超越了很多人认为还属于新事物的 Lighttpd、Nginx,性能高出作为行业标准的 Apache 一倍有余。 于是兄弟我顺便把最新版的 Nginx、Lighttpd、Apache 都拿来测了一圈。结果出人意料,Cherokee 牛皮吹爆,各项得分都低于 Nginx 和 […]

IE6 CSS Hack

最近在做一些UT的工作,写一些HTML和CSS,又遇到了一直很头疼的浏览器兼容问题。 主要就是让人讨厌的IE6,总是需要进行很多特殊的处理。 遇到表格类型的HTML区域,我一直觉得用table是最合适的,解决局部的单层表格,table是最方便的,HTML语言加入table这个标签的初衷就在这里。 不过因应用需要,我这回必须要用div实现table的布局,只能硬着头皮搞了。 对表格区域,我用ul标签,用li作为每行的容器。 在每个li标签中,用div作为列单元的容器。 这会遇到几个问题,同时也有一些优点吧: (缺点)列的宽度必须用样式来定义,比如每行相同的列单元,都必须使用相同的class,在css中给这个class定义绝对宽度,用width=240px这类的语句,代码冗余比较多 (缺点)每个div必须添加float:left的css定义,因为div是块状元素,默认是按行竖着排列的,设为浮动元素后,才可以横着排列 (缺点)float:left这个属性的排列方式,我总结的是按左上原则,可以理解为左上角是引力中心,把每个float元素都紧紧地吸附着,如果右侧有空间,就顺序排列在右侧,如果没空间了,就到下面一行尽量靠左的位置开始排列……,因此如果宽度不够,改行左边单元的高度又高于其他单元,那么最右侧的单元会卡在左边的单元右侧,呃,可能不好理解,回头我给个图,专门说一下这个规则 (缺点)li的高度默认不是自适应,当div单元的高度很大时,会突破li容器,影响下一行li的显示,呃……不过这个是有办法解决的,这篇文章主要就是来说明这个解决办法 (优点)div对浏览器来说就是一个简单的元素,浏览器每读完一个div,就可以立即显示,不必等待所有html代码都下载完才画出页面,这也是大家不喜欢table的主要原因 (优点)每行都有自己单独的列元素,每列的宽度可以不一致,这点table很难做到,即便能做到,也是用非常绕弯的方法,而用li+div来解决,就很灵活 看似缺点比较多,不过缺点都可以解决。 下面列举几个方法,就不一一对应了,其实道理都是相通的: […]

Regular Expression 排除字符串 不包含字符串

今天在写一个 Symfony 的路由匹配规则,查看文档的时候发现有一个 requirements 参数,可以对自定义的变量匹配正则表达式。用它匹配特定的字符串很容易,比如 requirements: { id: \d+ } 表示匹配一个或多个数字形式的 id,但我的要求是排除某些字符串之后的匹配,这个我就不知道怎么做了。 上网找了很多,最后还是 Google 帮我找到了想要的结果。 […]

辅助开发工具

平时经常会做一些编码和解码之类的转换,每次都要写个小文件,真麻烦,上网找过一些客户端的小工具,也都不太好用。 自己写了一个页面,随时可以使用,而且做了一系列的人性化设计,比如高亮显示之类的,感觉还不错。 大家看看吧:http://code.leakon.com/php/tools 只有一个页面,随时可以扩充新的转换。 看源码:http://leakon.googlecode.com/svn/trunk/leakon/php/tools/index.php

diff 用法

语法:diff [选项] file1 file2 说明:该命令告诉用户,为了使两个文件 file1 和 file2 一致,需要修改它们的哪些行。如果用 “- ”表示 file1 或 file2,则表示标准输入。如果 file1 […]

统计项目代码行数

切换到你项目的根目录下,执行下面的命令,会逐行显示每个文件的行数,和累加值。 wc -l `find ./ |grep .php | grep -v .svn` 这里是统计PHP代码,对所有类型的文件分别执行这个命令,把结果加起来就可以了。 注意,这种方式把注释和换行都算作代码内容了,是粗略的统计。

PHP 文件锁 flock 负载均衡

最近有个项目,采用单台前端服务器提供Web服务,程序需要实时访问后端服务器。后端一共有几十台服务器,但有压力限制,单台负载不能过高,必须做负载均衡。 最简单的方式是用随机数,前端来请求的时候,随机挑选一台后端服务器,但这并不能保证压力平均分布,很有可能在某一段时间内请求都落到同一台服务器上,很容易导致这台服务器停止服务。 后来想到用文件锁的方式,来标记访问计数,顺序访问后端的每一台服务器,让每一台服务器一个周期只被访问一次。 在进行了多次功能测试和压力测试后,验证了这种想法的可行性,然后写了一个IDService类,封装了整个过程。 我在Google提供的SVN服务器上保存了源码,大家可以在 http://leakon.googlecode.com/svn/trunk/leakon/php/flock/flock.php 这个地址看到源码,或者用SVN工具CheckOut到本地。 核心过程,就是初始化的时候给一个ID范围,默认是从0开始,如果你的server_count是32,那么调用getId()方法的时候,我会顺序给你31至0这32个ID,采用文件锁就是考虑到并发请求之间彼此独立,一个进程读数据文件的时候要加独占锁,解锁前,其他进程无法读取数据文件。 ID分配给你了,每个ID对应哪个服务器,就是你自己做映射的事了,保证了这个模块的无关性和独立性,和其他所有模块保持无耦合。 这是在PHP5的环境下写的,const 定义了3个类常量: LINE_FEED 是换行符,Windows 下是 \r\n,Linux […]

单元测试

有些道理,大家都明白的,但真正要做的时候,却很少有人能落到实处。 在学软件工程的时候,第一次听到了单元测试和测试用例这些词,印象很深刻 。 书上讲的都是软件开发这个行业几十年来总结的经验,很有道理,也很有说服力,我也十分认同书上的做法。 我也感觉自己是一个喜欢追求完美的人,看到书上说的那些测试的方法,比如边缘测试之类的,在感叹前人总结的方法很优秀的同时,自己也暗下决心,以后我写的程序,也要有规范的接口,有明确的输入输出,要有完备的测试用例,把每一个细节都测试到,让自己的程序表现完美。 然而,在现实中,总是事与愿违。 大学期间写的程序就不说了,我到现在正式工作已经两年半了,写的代码少说也就几万行。Bug是难免的,但总是被别人发现。 我一直没有做过规范的单元测试。 原因是多方面的,但主要在自己。 懒惰,是程序员最大的敌人! 当需求明确时,我会立即投入编码,把脑子里那些自认为不错的逻辑,用程序代码实现出来,这个过程是十分开心的。程序完成后,输入预定的参数,得到预想的结果,那种成就感,难以用语言形容。 我想问一句,这个时候,这个程序算是开发完毕了吗? 以前,我是这样认为的。我也坚信,国内绝大部分的程序员,都是这样认为的。 实际上,这就好像万里长征刚迈出第一步而已。虽然有些夸张,但事实如此。 你给你的程序写出测试用例了吗?你对程序的每一个模块,做了单元测试了吗?在输入数据的时候,是否输入了边界值?是否输入了非法值?有没有试过不给输入,看看程序输出什么? […]