php是由C实现的一种动态语言,所谓动态语言以及静态语言其实区分的标准就是变量数据类型确定的时间,动态语言在运行时候才会确定变量类型而静态语言则在编译期就可以确定。打算这段时间系统的看一下PHP的源码,了解一下PHP的实现和内部结构。要了解PHP语言的内核结构首先要清楚PHP的源码结构。
1. build 和编译有关的目录。
2. ext 扩展库代码,例如 mysql、zlib、iconv 等我们熟悉的扩展库。其中/ext/standard/ 目录下是常用的标准函数集。
3. main 主目录包含主要的 PHP 宏和定义。
4. sapi 和各种服务器的接口调用,例如apache、IIS等,也包含一般的fastcgi、cgi等。
5. win32 和 Windows 下编译 PHP 有关的脚本。
6. Zend 文件夹核心的引擎,所有的 Zend API 定义与宏等。
7. scripts Linux 下的脚本目录。
8. tests 测试脚本目录
9. sapi 各类 Web 服务器的接口。
10.TSRM Zend 和 PHP 的 “线程安全资源管理器” (TSRM) 目录。
11.pear 这个目录就是“PHP 扩展与应用仓库”的目录。包含了PEAR 的核心文件。
以上是PHP的源码目录,要研究内核源码还是要花点时间的,我打算从zend引擎,沿着PHP提供的基本语法和结构逐步深入。在研究PHP源码之前首先要搞点工具方便我们追踪和分析代码,平时开发都在linux上首推几个工具,vim+ctag用于阅读追踪代码,gcc/gdb用于调试,阅读需要掌握基本的C语言语法以及基本的数据结构知识,对PHP有一定的了解。
编译PHP debug版(生成符号方便后续gdb追踪):
./configure --enable-debug
make
make install
gdb的使用:
1.可以通过nm命令获取PHP编译生成的符号集,用于后续我们设置断点
2.启动gdb
3.加载php解释器到gdb
file /usr/bin/php
4.更具前面nm获得的符号设置断点
b zif_explode
注意: 为了保证函数不和c库中的符号重复,在导出函数前都加上统一前缀zif
5.基本就可以使用gdb 的一些命令进行追踪了