没有合适的资源?快使用搜索试试~ 我知道了~
首页深入理解PHP内核.pdf
资源详情
资源评论
资源推荐


TIPI
TIPI:深入理解PHP内核
www.php-internals.com TIPI_2014-04-29_V0.8.3
reeze http://reeze.cn
er http://www.zhangabc.com
phppan http://www.phppan.com
第一章 准备工作和背景知识
千里之行,始于足下。千里之行,始于足下。
在开始进入PHP的内核实现之前,需要做一些准备工作,也需要了解一些背景知识。本章主要涉及PHP源码的获
取,PHP源码的编译,从而得到我们的调试环境。
接下来,我们将简单描述PHP源码的结构以及在*nix环境和Windows环境下如何阅读源码。最后我们介绍在阅读
PHP源码过程中经常会遇到的一些语句。
如果你没有接触过PHP,或者对PHP的历史不太了解,我们推荐你先移步百度百科 PHP,这里有PHP非常详细的历
史介绍,它包括PHP的诞生,PHP的发展,PHP的应用,PHP现有三大版本的介绍以及对于PHP6的展望等。
目前PHP6已经停止开发了,PHP6的设计初衷是向后不兼容以及Unicode支持等。目前 很多特性已经在PHP5.3
和PHP5.4中实现了:比如5.4中的traits,支持C#类似的getter&setter语法(目前处在实现阶段), 基本类型的类
型提示等。
下面,我们将介绍源码阅读环境的搭建。
看到这有什么想法或疑问?点击这里参与讨论吧!
第一节 环境搭建
在开始学习PHP实现之前,我们需要一个实验和学习的环境。下面介绍一下怎样在*nix环境下准备和搭建PHP环境。
(*nix指的是类Unix环境,比如各种Linux发行版,FreeBSD, OpenSolaris, Mac OS X等操作系统)
1.获取PHP源码
为了学习PHP的实现,首先需要下载PHP的源代码。下载源码首选是去PHP官方网站
深入理解PHP内核
- 1 -© 本文档使用 看云 构建

http://php.net/downloads.php下载,如果你喜欢使用svn/git等版本控制软件,也可以使用svn/git来获取最新的
源代码。
# git 官方地址
git clone https://git.php.net/repository/php-src.git
# 也可以访问github官方镜像
git clone git://github.com/php/php-src.git
cd php-src && git checkout origin PHP-5.3 # 签出5.3分支
# svn地址不变,不过不推荐从这里签出代码
cd ~
svn co http://svn.php.net/repository/php/php-src/branches/PHP_5_2 php-src-5.2 #5.2版本
svn co http://svn.php.net/repository/php/php-src/branches/PHP_5_3 php-src-5.3 #5.3版本
笔者比较喜欢用版本控制软件签出代码,这样做的好处是能看到PHP每次修改的内容及日志信息,如果自己修改了
其中的某些内容也能快速的查看到,如果你想修复PHP的某个Bug或者提交新功能的话,有版本控制也会容易的多,
更多信息可以参考附录:怎样为PHP做贡献。
目前PHP已经迁移到Git了,PHP的wiki上有关于 迁移到Git的说明,以及使用Git的流程
在笔者编写这些内容的时候PHP版本控制是还基于SVN的,上面提到的github镜像地址目前已经没有同步更新
了, 由于把svn同步到git会对系统性能造成明显影响,加上社区还没有就到底是否迁移到git达成一致,所以也就
停止了更新。 目前很多开源软件都开始转向了分布式版本控制系统(DVCS), 例如Python语言在转向DVCS时对
目前的分布式版本控制系统做了一个详细的对比, 如果以前没有接触过,笔者强烈建议试试这些版本控制软件。
现在Github的同步是实时的。 所以习惯Github的话,基本上可以把Github当做官方版本库了。
2.准备编译环境
在*nix环境下,需要安装编译构建环境。如果你用的是Ubuntu或者是用apt做为包管理的系统,可以通过如下命令
快速安装:
sudo apt-get install build-essential
如果你使用的是Mac OS X,则需要安装Xcode。Xcode可以在Mac OS X的安装盘中找到,如果你有Apple ID的
话,也可以登陆苹果开发者网站http://developer.apple.com/下载。
如果你不愿意下载庞大的Xcode,也可以去https://github.com/kennethreitz/osx-gcc-installer下载安装包,
只安装所需的命令行工具。
3. 编译
下一步可以开始编译了,本文只简单介绍基本的编译过程,不包含Apache的PHP支持以及Mysql等模块的编译。相
关资料请自行查阅相关文档。如果你是从svn/git签出的代码则需要执行代码根目录的buildconf脚本以生成所需要的
构建脚本。
cd ~/php-src
./buildconf
执行完以后就可以开始configure了,configure有很多的参数,比如指定安装目录,是否开启相关模块等选项:
深入理解PHP内核
- 2 -© 本文档使用 看云 构建

有的系统自带的 autoconf 程序版本会有Bug,可能导致扩展的配置无法更新,如果在执行 ./buildconf 时 报
错,可以根据出错信息安装合适版本的autoconf工具。
./configure --help # 查看可用参数
为了尽快得到可以测试的环境,我们仅编译一个最精简的PHP。通过执行 ./configure --disable-all 来进行配置。
以后如果需要其他功能可以重新编译。如果configure命令出现错误,可能是缺少PHP所依赖的库,各个系统的环境
可能不一样。出现错误可根据出错信息上网搜索。 直到完成configure。configure完成后我们就可以开始编译了。
./configure --disable-all
make
在*nix下编译过程序的读者应该都熟悉经典的configure make,make install吧。执行make之后是否需要make
install就取决于你了。如果install的话最好在configure的时候是用prefix参数指定安装目录, 不建议安装到系统目
录, 避免和系统原有的PHP版本冲突。在make 完以后,在sapi/cli目录里就已经有了php的可以执行文件. 执行一
下命令:
./sapi/cli/php -v
-v参数表示输出版本号,如果命令执行完后看到输出php版本信息则说明编译成功。如果是make install的话可以执
行$prefix/bin/php这个路径的php。当然如果是安装在系统目录或者你的prefix目录在$PATH环境变量里的话,直
接执行php就行了。
在只进行 make 而不 make install 时,只是编译为可执行二进制文件,所以在终端下执行的php-cli所在路径就
是 php-src/sapi/cli/php 。
后续的学习中可能会需要重复configure make 或者 make && make install 这几个步骤。
Windows环境的编译
Windows环境下的编译可以参考官方Wiki的说明:https://wiki.php.net/internals/windows/stepbystepbuild
推荐书籍和参考
Gnu Make中文书册
《Autotools A Practioner's Guide》
第二节 源码结构、阅读代码方法
PHP源码目录结构
俗话讲:重剑无锋,大巧不工。PHP的源码在结构上非常清晰。下面先简单介绍一下PHP源码的目录结构。
根目录: /根目录: / 这个目录包含的东西比较多,主要包含一些说明文件以及设计方案。 其实项目中的这些README文件
是非常值得阅读的例如:
深入理解PHP内核
- 3 -© 本文档使用 看云 构建

/README.PHP4-TO-PHP5-THIN-CHANGES 这个文件就详细列举了PHP4和PHP5的一些差异。
还有有一个比较重要的文件/CODING_STANDARDS,如果要想写PHP扩展的话,这个文件一定要阅读一下,不
管你个人的代码风格是什么样,怎么样使用缩进和花括号,既然来到了这样一个团体里就应该去适应这样的规
范,这样在阅读代码或者别人阅读你的代码是都会更轻松。
buildbuild 顾名思义,这里主要放置一些和源码编译相关的一些文件,比如开始构建之前的buildconf脚本等文件,还
有一些检查环境的脚本等。
extext 官方扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实
现,都在这个目录中。个人写的扩展在测试时也可以放到这个目录,方便测试和调试。
mainmain 这里存放的就是PHP最为核心的文件了,主要实现PHP的基本设施,这里和Zend引擎不一样,Zend引擎
主要实现语言最核心的语言运行环境。
ZendZend Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。
pearpear “PHP 扩展与应用仓库”,包含PEAR的核心文件。
sapisapi 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
TSRMTSRM PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封
装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。
teststests PHP的测试脚本集合,包含PHP各项功能的测试文件
win32win32 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一
样,同时也包括了Windows下编译PHP相关的脚本。
PHP的测试比较有意思,它使用PHP来测试PHP,测试php脚本在/run-tests.php,这个脚本读取tests目录中phpt
文件。读者可以打开这些看看,php定义了一套简单的规则来测试,例如以下的这个测试脚
本/tests/basic/001.phpt:
--TEST--
Trivial "Hello World" test
--FILE--
<?php echo "Hello World"?>
--EXPECT--
Hello World
这段测试脚本很容易看懂,执行--FILE--下面的PHP文件,如果最终的输出是--EXPECT--所期望的结果则表示这个
测试通过,可能会有读者会想,如果测试的脚本不小心触发Fatal Error,或者抛出未被捕获的异常了,因为如果在同
一个进程中执行,测试就会停止,后面的测试也将无法执行,php中有很多将脚本隔离的方法比如:
system(),exec()等函数,这样可以使用主测试进程服务调度被测脚本和检测测试结果,通过这些外部调用执行测
试。php测试使用了proc_open()函数,这样就可以保证测试脚本和被测试脚本之间能隔离开。phpt文件的编写详细
信息可参考 附录E phpt文件的编写。如果你真的那么感兴趣,那么研究下 $PHP_SRC/run-tests.php 脚本的实现也
是不错的选择。这个测试框架刚开始由PHP的发明者Rasmus Lerdorf编写,后来进行了很多的改进。后面可能会引
入并行测试的支持。
PHP源码阅读工具
使用VIM + Ctags
通常在Linux或其他*Nix环境我们都使用VIM作为代码编辑工具,在纯命令终端下,它几乎是无可替代的。它具有非
常强大的扩展机制,在文字编辑方面基本上无所不能。不过Emacs用户请不要激动,笔者还没有真正使用Emacs,
虽然我知道它甚至可以煮咖啡,还是等笔者有时间了或许会试试煮杯咖啡边喝边写。
推荐在Linux下编写代码的读者或多或少的试一试ctags。ctags支持非常多的语言,可以将源代码中的各种符号(如:
函数、宏类等信息)抽取出来做上标记并保存到一个文件中,供其他文本编辑工具(VIM,EMACS等)进行检索。
深入理解PHP内核
- 4 -© 本文档使用 看云 构建
剩余270页未读,继续阅读













安全验证
文档复制为VIP权益,开通VIP直接复制

评论2