我相信任何一个有点追求的PHP程序员都曾经有过阅读PHP源码的冲动,而且我估计这其中的很多人都没有将冲动转化为行动,即使有少部分人行为了,最终也难以维持——原因很简单:代码太多,太复杂了,完全无从下手——当然我也是这大多数人中的一员。实际上有时候我个人觉得从头一行一行地阅读源码未必是有必要的,甚至也未必是可行的。
如果这样的话,我们又怎么样才能知道PHP内部是怎么执行PHP程序的呢?阅读文档(PHP官方也没提供)和别人写的文章(例如我前段时间翻译的:深入理解Zend执行引擎)这只能学到一些理论知识,而且读多了总是会感到有些缺失。程序设计本身就是一件实践性的工作,就像学某个程序设计语言一样,我们只有用这个语言写程序,运行所写的程序后才能掌握这门语言,例如我们学习PHP语言,我们会写上一段PHP代码,然后使用echo/print/var_dump之类的语句或者函数输出代码中的变量,然后才能确认某个函数或者语言特性的作用,这样实践多次之后就可以学会PHP的各种特性,从而达到掌握PHP语言的目的。那么我们是否可以在PHP内部源码中使用C语言中的printf函数(类似PHP中的echo)来输出我们想要检查的变量的值呢?这么做当然是可以的,但太繁琐了,光每次修改源码后重新编译的工作就会把人搞死,而且这种做法也非常业余。专业的做法就是调试PHP内部源码,使用调试工具来单步执行PHP源码,使用调试工具打印我们想查看的变量来确认源码是怎么工作的,这就是这篇文章的主题。
首先声明下这篇文章使用的调试工具是gdb,所有示例都是在类Unix平台下进行的(我是在MacOS上进行操作的,当然Windows上也可以使用gdb,只是需要一些工具),另外为了讲解方面,我直接使用了命令行,你也可以使用eclipse之类的IDE工具进行调试,当然如果是在Windows上,你也可以使用VS来进行调试,不过貌似在Windows下编译PHP有些特殊,有这个需求的同学请自行搜索。另外这篇文章假设你至少了解一些gdb的基本用法(这篇文章也只用到了一些基本用法),我不会对gdb的使用进行介绍,对于完全不了解或者忘记了怎么使用gdb的同学,我强烈建议你去学习下gdb,如果你掌握了怎么使用gdb进行调试,那么你基本上可以自如地使用任何调式工具。
编译PHP源码你可以从PHP哪家白癜风医院便宜中医治疗白癜风的方法