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 TIPI:深⼊理解PHP内核 TIPI_2014-04-29_V0.8.3 TIPI:深⼊理解PHP内核 TIPI_2014-04-29_V0.8.3 第⼀章 准备⼯作和背景知识 千⾥之⾏,始于⾜下。 在开始进⼊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官⽅⽹站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 PHP-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. 编译 TIPI:深⼊理解PHP内核 TIPI_2014-04-29_V0.8.3 下⼀步可以开始编译了,本⽂只简单介绍基本的编译过程,不包含Apache的PHP⽀持以及Mysql等模块的编译。 相关资料请⾃⾏查阅相 关⽂档。 如果你是从svn/git签出的代码则需要执⾏代码根⽬录的buildconf脚本以⽣成所需要的构建脚本。 cd ~/php-src ./buildconf 执⾏完以后就可以开始configure了,configure有很多的参数,⽐如指定安装⽬录,是否开启相关模块等选项: 有的系统⾃带的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所在路径就是phpsrc/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⽂件是⾮常值得阅读的例 如: /README.PHP4-TO-PHP5-THIN-CHANGES 这个⽂件就详细列举了PHP4和PHP5的⼀些差异。 还有有⼀个⽐较重要的⽂件/CODING_STANDARDS,如果要想写PHP扩展的话,这个⽂件⼀定要阅读⼀下, 不管你个⼈的代码 ⻛格是什么样,怎么样使⽤缩进和花括号,既然来到了这样⼀个团体⾥就应该去适应这样的规范,这样在阅读代码或者别⼈阅读 你的 代码是都会更轻松。 build 顾名思义,这⾥主要放置⼀些和源码编译相关的⼀些⽂件,⽐如开始构建之前的buildconf脚本等⽂件,还有⼀些检查环境的脚本 等。 TIPI:深⼊理解PHP内核 TIPI_2014-04-29_V0.8.3 ext 官⽅扩展⽬录,包括了绝⼤多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现,都在这个⽬录中。个⼈ 写的扩展在测试时也可以放到这个⽬录,⽅便测试和调试。 main 这⾥存放的就是PHP最为核⼼的⽂件了,主要实现PHP的基本设施,这⾥和Zend引擎不⼀样,Zend引擎主要实现语⾔最核⼼的语 ⾔运⾏环境。 Zend Zend引擎的实现⽬录,⽐如脚本的词法语法解析,opcode的执⾏以及扩展机制的实现等等。 pear “PHP 扩展与应⽤仓库”,包含PEAR的核⼼⽂件。 sapi 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接⼝。 TSRM PHP的线程安全是构建在TSRM库之上的,PHP实现中常⻅的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器。 tests PHP的测试脚本集合,包含PHP各项功能的测试⽂件 win32 这个⽬录主要包括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()等函数,这样可以使⽤主测试进程服务调

pdf文档 Thinking_in_PHP_internals-TIPI_2014-04-29_V0.8.3

计算机 > PHP > php > 文档预览
206 页 0 下载 650 浏览 0 评论 0 收藏 3.0分
温馨提示:如果当前文档出现乱码或未能正常浏览,请先下载原文档进行浏览。
Thinking_in_PHP_internals-TIPI_2014-04-29_V0.8.3 第 1 页 Thinking_in_PHP_internals-TIPI_2014-04-29_V0.8.3 第 2 页 Thinking_in_PHP_internals-TIPI_2014-04-29_V0.8.3 第 3 页 Thinking_in_PHP_internals-TIPI_2014-04-29_V0.8.3 第 4 页 Thinking_in_PHP_internals-TIPI_2014-04-29_V0.8.3 第 5 页
下载文档到电脑,方便使用
还有 201 页可预览,继续阅读
本文档由 user2020-12-27 08:57:59上传分享
给文档打分
您好可以输入 255 个字符
DocHub文库的中文名是什么?( 答案:多哈 )
评论列表
  • 暂时还没有评论,期待您的金玉良言