PHP require 绝对路径 autoload

在写PHP程序时,如果文件比较多,目录也比较多,有很多require_once的情况。 如果程序的入口不唯一,并且分布在不同的目录,必须require绝对路径,如果是相对路径,PHP会把入口文件的路径作为基本路径,require里的相对路径都是相对于入口文件的。 这样带来最大的问题就是自己部署的程序,给别人提供接口时,别人根本无法使用! 所以要用绝对路径。 做法就是选一个require的入口文件,大家都要包含这个文件,这个文件的开头加上这么一句:

单元测试

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

说点什么

现在是周五22:20,本来想玩会儿游戏,可想起blog已经好几天没写东西了,攒了好多想说的,再不说就忘了。 这周有点郁闷,但也比以前更充实一些。 上周给新部门的同事讲了一些PHP网站开发方面的经验,也聊了一些优化方面的东西。来的人不少,弄得我挺紧张的。 因为比较忙,在做一个紧急上线的新项目,没有做充分的准备,有些东西没有讲得很深入。后来还讲了一个IP查询算法,是我自己想的,讲出来才知道,原来大家都有过研究。 肯定让来参加讨论会的同学们有些失望,我也觉得很郁闷。 后来和同事聊了聊,我给人的感觉是知道的东西挺多,但都不深入。 我不希望自己是这样,可实事求是地讲我确实一直存在这样的缺点。 可是话又说回来,我所了解的东西,也没有完全讲出来,我有自己深入了解的东西,工作2年了,每天都很忙,积累了很多经验,恐怕不可能在2个小时内全都讲完吧。 从另一个角度看,我觉得自己被别人小看了,也许这才是我郁闷的真正原因。 每个人都有虚荣心,像我这样的开发人员,最希望得到的,恐怕就是得到别人对我技术的认可吧。 恰巧昨天看到公司内部的技术周刊,有人讲了很多Web开发方面的东西,主要是html、css和javascript的,写得很长,很深入,也很具体。 我做Web开发也2年多了,那篇文章里说的每一条,我都知道,而且有些方面比文章里写的有更深的研究,但,我唯一没有做到的,就是把这每一点都写下来,都积累成文字记录,传给大家看。 这个问题我前一段时间已经意识到了,通过这件事,也让我有了更深的体会。 因此,我建了这个blog。 我也要把我积累的点点滴滴,都写下来,为自己记录,也为别人分享。 […]

GMail 安全隐患 Google 密码

尽管我下面要讲述的情景并不会经常出现,但后果却是很严重,希望引起Google的注意,同时也希望能提醒提供类似功能的其他公司! 我注册了Google的帐号,有了一个GMail邮箱,他很好用,而且我每天都要登录我的邮箱收发信件。 正是由于使用频繁,我在登录的时候,选中了“在此计算机上保存我的信息”,免去了每次登录都要输入密码的麻烦。 我在家,在公司,在我的笔记本上,三处地方,都应用了这种设置,所以我在这三台电脑上打开http://mail.google.com的时候,都是直接进入邮箱。 如果,我因为某事,不再继续为这家公司工作了,而我临走时忘记清空浏览器的cookie,那么,这个公司的网管,就可以登录我的系统,查看我遗留的各种文档。 当他再次打开http://mail.google.com的时候,直接进入了我的邮箱!!! 这是一个非常严重的问题。 我曾经想过补救,我认为这方法应该有效,但Google没有这样做: 我在家里的电脑上登录GMail,更改我的密码,然后退出登录,当我再次登录时,需要输入新的密码。这个过程没问题。 但我用我的笔记本,在浏览器上打开http://mail.google.com,依然可以访问。 这就是问题的根源!!! 这个时候,那家公司的网管,是可以访问我的邮箱的,因为Google没有对密码做数字签名!这是问题的关键!也是我这篇文章的核心内容! 在Web安全方面,Google应该有很深的经验了。 利用cookie记录登录状态,避免每次输入密码,是很好的设计,很人性化。 唯一的缺点,就是没有提供给用户一个既安全又方便的途径来取消这一遍历登录方式。 […]

PHP 数组 递归 magic_quotes 回调函数

为了适应不同的服务器设置,首先判断是否打开了 magic_quotes,如果打开了,在开始的地方就全部过滤。 后面程序统一默认为 magic_quotes 已关闭,避免了多次转义的问题。 一行代码的函数,两点需要注意,一个是递归调用,另一个是传递回调函数的方法,可以引用一个类的静态方法。 实现过程,比较优雅,不是吗?

PHP header location 继续执行 exit

PHP的header可以输出http头部信息,前提是,在header之前不能输出任何内容,因为所有的内容都作为http的body输出给客户端了,一旦有body的内容,就不可能再添加任何head部分的信息。 header函数的一个常用的方式就是用来做转向,redirect。 比如,我需要转到某个地址,只要执行下述代码: 浏览器会收到一个302的http状态码,告诉他这个内容已经被转移了。 重要的是,php会在调用header函数后,继续执行后面的代码,你可以用我的代码亲自试验一下: 肯定会执行到fwrite函数的,打开header.txt文件,检查时间! 对此,解决的办法是,要在每一个header函数后面加上exit,保证当前页面停止执行,进而转向location指定的地址。 为了避免到处都是exit,可以写一个专门用作转向的函数,比如: 另,为了避免在header之前输出body的内容,许多php框架都采用了php页面尾部不写?>的方式,因为有些人总习惯在?>后面添加一个换行,这真的是个不好的习惯。

FreeBSD 彩色 目录 LS gnuls

我的FreeBSD,登录的时候,用ls列表目录,是彩色的。 可执行文件是绿色,目录是蓝色,链接是青色,看起来很舒服,也更容易辨认系统。 要做到这样,很容易,只要系统装了gnuls就可以。 这个软件的porst安装在/usr/ports/misc/gnuls。 到这个目录下面,执行make install就可以了。 等安装完毕,在你的home目录下,编辑.cshrc,加入下面折行代码: alias ls ‘gnuls –color=auto –show-control-chars’ 保存,关闭,然后重新登录系统。 这个时候再用ls看看,都是彩色了吧。 如果不行,记得检查一下SecureCRT的设置,选择仿真终端的时候,我这边设置的是Linux […]

我的互联网

夜深了,抱着我的ThinkPad,躺在床上,写写今天对互联网感悟的心得。 我是一个搞Web开发的前端工程师,在某些公司,被认为是最低级的程序员,那里的C++牛人们,认为像我们这样的人就配写几行HTML,只有他们才配每天把算法、架构和高性能挂在嘴边。 我只是觉得,你有这样的想法,只能反映出你那井底之蛙的知识面和对前端技术的无知。 一件事,不同层次的人,会得出不同层次的看法。 就好像清朝的人第一次看见轮船,认为那就是一堆大铁皮,轮船内部的东西,他是看不到的,以他的见识,也理解不了轮船为什么能装载那么多人在海上航行。 今天看到“写给 WEB2.0 站长 不仅仅是泼冷水”,感触挺深。 什么是Web2.0呢? 我的理解,就是用户产生内容吧,在技术上说,就是有数据库保存用户提交内容的网站程序。 很肤浅的理解。 就像那个文章提到的,“典型的WEB程序员”的作品。有些人,确实是只会那么一点点SQL语句,就敢出来做个网站。 他们只是认为,把内容能存起来,能读出来,就OK了。 什么架构、部署、集群、稳定性、安全性、扩展性和可维护性,管那么多干嘛?搞了半天,能用几天还不知道呢。 […]

IE 无法打开 pdf rar http协议 cache-control

前两天在开发过程中遇到一个问题,用php做了一个下载文件的程序。 点击文件链接,如果是pdf、rar等类型的文件,浏览器会询问是打开还是保存。如果选择保存,把文件保存到硬盘上,就可以正常打开,但选择打开,就会出现问题,IE会提示“文档已损坏”。 反复检查问题,包括检查header的Content-type,都是正常的,没有问题,而且用Firefox不管是选择打开还是保存都正常。 以为是浏览器的问题了,后来,试着改了一下http头,加上了header(“Cache-Control:”),就可以解决了,里面不能使NO-CACHE。 看来在细节上,Firefox比IE考虑得更周到一些!