描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121328107
内容翔实,详细介绍PHP语言底层的实现
助力开发者进一步理解PHP,参与到PHP的实现中
第1章 PHP基础架构
1.1 简介
1.2 安装及调试
1.3 PHP7的变化
1.4 PHP的构成
1.5 生命周期
1.6 小结
第2章 SAPI
2.1 Cli
2.1.1 执行流程
2.1.2 内置Web服务器
2.2 Fpm
2.2.1 基本实现
2.2.2 Fpm的初始化
2.2.3 worker——请求处理
2.2.4 master——进程管理
2.3 Embed
2.3.1 实现
2.3.2 使用
2.4 小结
第3章 数据类型
3.1 变量
3.1.1 变量类型
3.1.2 内部实现
3.2 字符串
3.3 数组
3.3.1 基本实现
3.3.2 散列函数
3.3.3 数组的初始化
3.3.4 插入
3.3.5 哈希冲突
3.3.6 查找
3.3.7 扩容
3.4 引用
3.5 类型转换
3.5.1 转换为NULL
3.5.2 转换为布尔型
3.5.3 转换为整型
3.5.4 转换为浮点型
3.5.5 转换为字符串
3.5.6 转换为数组
3.5.7 转换为对象
3.6 小结
第4章 内存管理
4.1 变量的自动GC机制
4.1.1 引用计数
4.1.2 写时复制
4.1.3 回收时机
4.2 垃圾回收
4.2.1 回收算法
4.2.2 具体实现
4.3 内存池
4.3.1 内存池的初始化
4.3.2 内存分配
4.3.3 系统内存分配
4.3.4 内存释放
4.4 线程安全
4.4.1 TSRM的基本实现
4.4.2 线程私有数据
4.4.3 线程局部存储
4.5 小结
第5章 PHP的编译与执行
5.1 语言的编译与执行
5.1.1 编译型语言
5.1.2 解释型语言
5.2 Zend虚拟机
5.2.1 opline指令
5.2.2 zend_op_array
5.2.3 zend_execute_data
5.2.4 zend_executor_globals
5.3 PHP的编译
5.3.1 词法、语法解析
5.3.2 抽象语法树编译
5.3.3 pass_two()
5.4 PHP的执行
5.4.1 handler的定义
5.4.2 调度方式
5.4.3 执行流程
5.4.4 全局execute_data和
opline
5.5 运行时缓存
5.6 Opcache
5.6.1 opcode优化
5.6.2 JIT
5.7 小结
第6章 函数
6.1 用户自定义函数
6.1.1 语法解析
6.1.2 抽象语法树的编译
6.2 内部函数
6.3 函数的调用
6.4 函数的执行
6.5 小结
第7章 面向对象
7.1 类
7.1.1 常量
7.1.2 成员属性
7.1.3 成员方法
7.1.4 类的编译
7.1.5 内部类
7.1.6 类的自动加载
7.2 对象
7.2.1 对象的创建
7.2.2 非静态成员属性的读写
7.2.3 对象的复制
7.2.4 对象的比较
7.2.5 对象的销毁
7.3 继承
7.3.1 常量的继承
7.3.2 成员属性的继承
7.3.3 成员方法的继承
7.4 动态属性
7.5 魔术方法
7.6 小结
第8章 命名空间
8.1 概述
8.2 命名空间的定义
8.3 命名空间的使用
8.3.1 use导入
8.3.2 动态用法
8.4 小结
第9章 PHP基础语法的实现
9.1 静态变量
9.2 常量
9.2.1 const
9.2.2 define()
9.3 全局变量
9.3.1 全局变量符号表
9.3.2 全局变量的访问
9.3.3 全局变量的销毁
9.3.4 超全局变量
9.4 分支结构
9.4.1 if
9.4.2 switch
9.5 循环结构
9.5.1 while
9.5.2 do while
9.5.3 for
9.5.4 foreach
9.6 中断及跳转
9.6.1 break/continue
9.6.2 goto
9.7 include/require
9.8 异常处理
9.8.1 PHP中的try catch
9.8.2 内核中的异常处理
9.9 break/continue LABEL语法的
实现
9.10 小结
第10章 扩展开发
10.1 扩展的内部实现
10.2 扩展的构成及编译
10.2.1 脚本工具
10.2.2 扩展的编写步骤
10.2.3 config.m4
10.3 钩子函数
10.3.1 模块初始化阶段
10.3.2 请求初始化阶段
10.3.3 请求结束阶段
10.3.4 post deactivate阶段
10.3.5 模块关闭阶段
10.4 全局资源
10.5 ini配置
10.6 函数
10.6.1 内部函数注册
10.6.2 函数参数解析
10.6.3 引用传参
10.6.4 函数返回值
10.6.5 函数调用
10.7 Zval的操作
10.7.1 zval的创建及获取
10.7.2 变量复制
10.7.3 引用计数
10.7.4 字符串操作
10.7.5 数组操作
10.8 常量
10.9 面向对象
10.9.1 内部类注册
10.9.2 成员属性
10.9.3 成员方法
10.9.4 常量
10.9.5 类的实例化
10.10 资源
10.11 小结
PHP是一门优秀的Web开发的编程语言,一直说PHP是世界“秀”的语言,其他各个语言,包括Python/Java等语言都有相应的源码剖析或者内核解读之类的书籍,哪怕MySQL/Redis等都有相应的源码解读书籍。但是目前的图书市场,除了零零碎碎的一些PHP内核描述的文章,真正关于内核的书籍只有英文的《Extending and Embedding PHP》,中文电子版的《TIPI:深入理解PHP内核》算是相对比较专业的描述PHP内核特性的书籍。
本书从整个PHP的内部数据结构到内存管理GC,从PHP脚本的编译执行原理到扩展开发,都有详实、深入的描述,是一本国内难得的描述PHP内核的佳作,非常值得推荐。看完以后,对整个PHP的内部理解,会更上一个新档次。
秦朋是我曾经在360公司的同事,多年前他就表现出对PHP技术的巨大兴趣,经过几年的努力和对内核的深入阅读理解,终于编写了本书。我读完内容,感慨万千,对很多PHP内部技术细节都理解非常透彻,并且文风通俗易懂,代码翔实清晰,确实是对PHP下了很深的功夫,也体现了不俗的技术水平,对秦朋的努力感到骄傲和佩服。希望本书能够给中国PHP行业带来新的理解和血液,为PHP程序员们带来提高和成长,也让我国PHP技术真正提升到一个新的台阶。
——谢华亮(黑夜路人)
序二
认识作者,是在公司内网发现他分享了几个关于PHP内核的文章,后来在钉钉上直接找他交流是否能转载到我的PHP饭米粒的公众号上,一来二去,就熟悉了。
世面上PHP的书籍不少,但对于PHP内核分析的书很少,能分析这么透彻就更少了,以前对PHP5.x版本做过粗略的分析,对PHP7的变化其实了解并不多,当作者把电子初版给我之后,一口气看了前面几章,从SAPI到ZVAL都写得很透彻,收获颇多。
当由PC互联网转战到移动互联网、物联网后,PHP的优势确实小了,一些新的语言也陆陆续续冒出,也受到了不同程度的热捧,其实这些高并发、非阻塞都不是什么高大上的概念,大多数常用语言都能实现,但目前很多人并没有修练好内功,一但碰到问题,可能就会转向那些可以直接补坑的新事物上,而不是去理解这门语言。可以预料到的是,一但在新的语言上碰到坑,又会转向另一个,周而复始,对于自己,基本没有提高,所以透过现象看本质很有必要,也就能一通百通了。
另一方面,现在的人都比较浮躁,很少有年轻人能够沉下心去做深入的研究,我从业10多年,面试的人也众多,大多数人在工作三年左右就会遇到一个瓶颈,主要原因是对业务非常熟悉了,也没有挑战了,就想通过换个环境来找新鲜感。而有些人可以自我蜕变,从日常的业务中找到感兴趣的点深入学习,就如本书的作者一样,这给大多数人也指明了另一种突破的方式。
后建议PHPer都可以精读此书,你就可以知道为什么PHP的一个变量类型可以变来变去,也可以知道为什么PHP的数组这么强大,深入之后,一定会为你打开一扇新的大门,让你在技术的道路上走得更扎实。
——王晶(滴滴技术专家,Swoole开发者)
前 言
为什么要写这本书
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:[email protected];QQ群:103330909
致谢
首先感谢PHP7的主要开发者鸟哥与PHP社区的其他开发者,正是他们的智慧造就了PHP,期待未来PHP能够有更加广阔的发展空间。在这里尤其要感谢Swoole的创始人韩天峰老师,本项目有幸得到韩老师的推荐,得到了众多人的关注。另外要单独感谢陈晓猛编辑,在他耐心地指导、审稿、修改工作下,终才有了本书的诞生。
秦朋
——韩天峰(车轮互联总架构师,Swoole创始人)
此书图文并茂,内容详实,细致。非常适合对PHP有一定了解,想深入学习PHP运行机制的同学。
——信海龙(阿里巴巴技术专家)
在PHP社区中,关于PHP内核的资料非常有限,大部分PHP开发者停留在使用的阶段,而对PHP的内部实现少有涉猎。该书弥补了这一缺憾,从变量、基础语法的实现到PHP的编译、执行以及函数、面向对象的实现,非常全面、详细的介绍了PHP7底层的原理,强烈推荐!
——柏强利(滴滴高级开发工程师)
评论
还没有评论。