PHP作为最流行的语言之一,自第一个版本发布至今的二十几年里经历了多次重大改进,PHP7版本最大的特色在于其性能上的突破,比PHP5快了一倍。目前PHP7已经得到了广泛应用,越来越多的项目从PHP5迁移到了PHP7。目前,关于PHP内核的资料非常有限,本书以当前最为流行的PHP7版本为基础,系统性地、尽可能详细地介绍PHP语言底层的实现,旨在帮助更多的开发者进一步理解PHP,参与到PHP的实现中,为未来PHP的发展贡献一份力量!全书内容主要包括PHP数据类型的实现、PHP的编译及执行、PHP内存的管理、函数及面向对象的实现、PHP基础语法的实现,以及PHP扩展的开发。
本书适用于有一定C语言基础的PHP高级工程师,或者想了解PHP7的内部实现、扩展开发的工程师。
基于PHP7版本,围绕PHP的SAPI、数据类型、内存管理、编译与执行、函数、类及基础语法等的实现,深刻揭示PHP底层Zend引擎的实现原理
秦朋,高级开发工程师,曾就职于360、搜狗等公司,有多年高并发、分布式服务开发经验,尤其熟悉PHP扩展及其底层的实现机制,对PHP有深入的理解。目前就职于滴滴引擎技术部,从事分单架构方面的工作。
前 言
为什么要写这本书
PHP作为最流行的语言之一,自第一个版本发布至今的二十几年里经历了多次重大的改进,尤其是PHP7版本的发布,其最大的亮点在于性能上的提升,比PHP5快了一倍。随着PHP7的不断普及,越来越多的项目从PHP5迁移到了PHP7,毫无疑问,PHP7将成为PHP历史上里程碑式的一个版本。我是在大学时代接触到的PHP,初次相识就被其简洁、易用的语法所吸引了。在工作后的几年里,我一直使用PHP作为主要的开发语言。当然,除了PHP,我也使用过很多其他语言,比如C、C++、Java、Golang、Python等,不同的语言有各自的特点、优势,让我印象最深的、也让我最喜欢的有C、Golang、PHP。
C
这是我评价最高的一门语言,其强大的操控能力、简洁的语法、易于理解的处理方式无一不让我折服。编程语言本身只是控制计算机的一种工具,然而很多高级语言过度隔离了人与计算机间的联系,使得编程者并不理解计算机实际的工作机制,只能被编程语言限定在固定范围内,而C语言在这一点上做得恰到好处,其没有过度干预我们对计算机的操控,允许我们自由地控制内存、CPU。当然,C语言也有很多不方便的地方,过于简单的接口使得很多操作不得不通过编写大量的代码来实现。
Golang
并发是我对其最大的印象,我们可以用更容易理解的方式来实现并发,但是它的内存控制没有C语言那么方便、灵活。
PHP
PHP的底层是C语言实现的,这也使得它继承了很多C语言的基因,PHP的简洁、易用、学习成本低等特点成就了它今天的地位。
PHP的高度封装性与弱类型的特点使得很多操作极其简便,例如JSON的解析如果在Golang中完成,则需要定义一系列的结构体,然后才能完成解析,而在PHP中通过一行代码就可以完成。正是PHP底层的强大才得以实现如此简便的操作,那么强大的PHP背后到底是什么样子的呢?我想很多PHPer都有过这个疑问。然而让人感到沮丧的是,关于PHP内核的资料非常有限,已有的这些资料也不全面、系统,多数局限在理论介绍的层面上。后来我就直接去读PHP的源码,渐渐地发现,以前很多不理解的问题都在源码中找到了答案。本书主要的出发点是给那些想要了解PHP底层实现的读者一些启发,帮助更多的人理解PHP的实现,甚至能够参与到PHP的开发中,为未来PHP的发展贡献一份力量!
本书适合的对象
有一定C语言基础的读者。
想要理解PHP内部实现的读者。
PHP高级工程师。
对虚拟机实现感兴趣的读者。
本书不适合作为PHP的入门教程。书中对于基础性的、概念性的东西介绍很少,重点是源码解析。
本书的结构
本书总共分为10章,章节之间存在一定的衔接,建议按照先后顺序阅读。其中第3~第9章为Zend引擎相关的内容,也是本书的核心章节。
第1章介绍PHP的基础内容。本章主要介绍PHP的历史发展、PHP7的主要变化,重点讲解PHP的构成部分与生命周期的几个阶段。
第2章介绍SAPI。本章选取了PHP三种常见的应用场景,介绍三个不同SAPI的实现:Cli、Fpm、Embed。SAPI是PHP的接入层,如果只想了解Zend引擎的内容,那么可以跳过本章。
第3章介绍数据类型。本章主要介绍PHP中变量的基础结构zval,以及不同类型的结构,它们是PHP中最基础的、使用最频繁的数据结构,通过本章的内容你将了解PHP中变量的内部实现。
第4章介绍内存管理。本章主要介绍PHP变量自动回收机制的实现,以及PHP底层内存池、线程安全相关的实现。通过本章的内容,你将了解变量的内存是如何进行管理的,为什么PHP中的变量不需要手动申请释放。其中内存池的实现比较独立,它的实现与tcmalloc类似;线程安全只在多线程环境下使用,常见的Fpm、Cli模式不会用到,本书其他章节介绍的内容都是非线程安全的。
第5章介绍PHP的编译与执行。本章介绍PHP代码从编译到执行的整个过程,这也是Zend引擎的核心实现。通过对本章的学习,你将了解PHP代码是如何被Zend引擎识别、执行的。
第6章介绍函数的实现。本章介绍PHP中函数的实现,这也是Zend引擎的核心部分,本章的内容与第5章相关,介绍函数的编译与执行。
第7章介绍面向对象。本章介绍面向对象相关的实现,主要包括类、对象的内部实现。
第8章介绍命名空间。本章介绍PHP中命名空间的实现,这部分内容比较简单,命名空间只涉及编译阶段。
第9章介绍基础语法的实现。本章主要介绍PHP中基础语法的实现,比如条件分支、循环结构、中断跳转、静态变量、常量、全局变量、文件加载等,这些语法涉及PHP的编译、执行,它们是PHP语言的基础组成部分。通过对本章的学习,你可以更全面地掌握PHP语言的实现。
第10章介绍扩展开发。本章的内容偏向应用性,主要介绍扩展开发中常用的一些接口、宏。
勘误与支持
因个人水平有限,以及时间比较仓促,书中难免有不足之处,还望读者批评指正。如果你对本书有比较好的建议或对书中内容有所疑惑,可与我联系。
Email:pangudashu@gmail.com;QQ群:103330909
致谢
首先感谢PHP7的主要开发者鸟哥与PHP社区的其他开发者,正是他们的智慧造就了PHP,期待未来PHP能够有更加广阔的发展空间。在这里尤其要感谢Swoole的创始人韩天峰老师,本项目有幸得到韩老师的推荐,得到了众多人的关注。另外要单独感谢陈晓猛编辑,在他耐心地指导、审稿、修改工作下,最终才有了本书的诞生。
秦朋
箭头改为->
增加一行代码 $ make && make install
增加一行代码 $ make && make install
【nTableSize】改为【nTableMask】
[-1, nTableMask] 改为 [nTableMask, -1]