描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111599197
1)滴滴出行专家联合撰写,多位PHP领域大咖推荐,全面吃透PHP底层设计之选
2)全面讲解PHP内核架构、核心实现与内存管理、词法与句法解析、Zend 虚拟机、函数及关键扩展等设计细节与源码实现
滴滴出行专家联合撰写,多位PHP领域大咖推荐,全面吃透PHP底层设计不二之选,全面讲解PHP内核架构、核心构成与内存管理、词法与句法解析、Zend 虚拟机、函数及关键扩展等设计细节与源码实现。
本书逻辑上分为四部分,共计14章内容。
第1~2章解读PHP 7的新特性、源码的整体框架(各目录的源码和功能)。
第3~6章详细介绍PHP 7的变量实现,涵盖基本变量zval的结构、字符串zend_string的实现、核心结构HashTable(即数组)实现,以及类与对象的实现。
第7~11章剖析PHP 7核心的实现,重点是PHP 7的生命周期,涵盖生命周期的模块初始化阶段中配置文件的解析,内存管理原理与实现,词法和语法分析的实现,核心Zend虚拟机的实现。
第12~14章介绍PHP 7中基本语法、函数、扩展的实现。
其中,第3章、第4章、第5章和第14章为本书的重点章节。
目录 Contents
本书赞誉
序
前言
第1章 PHP 7概况1
1.1 PHP简史与新特性1
1.2 PHP 7安装和调试7
1.2.1 编译安装7
1.2.2 使用GDB调试PHP 78
1.2.3 vld扩展10
1.3 PHP 7源码阅读工具介绍13
1.3.1 Source Insight13
1.3.2 Understand16
1.3.3 Vim Ctags19
1.4 本章小结20
第2章 初识PHP 7源码整体框架21
2.1 PHP 7语言的执行原理21
2.1.1 编译型语言与解释型语言21
2.1.2 PHP 7的执行原理概述23
2.2 PHP 7内核架构26
2.3 PHP 7源码结构初步介绍27
2.3.1 sapi目录源码27
2.3.2 Zend目录源码28
2.3.3 main目录源码29
2.3.4 ext目录源码29
2.3.5 TSRM目录源码29
2.4 本章小结30
第3章 基本变量31
3.1 基本知识31
3.1.1 数据类型31
3.1.2 结构体与联合体32
3.1.3 堆和栈的基本知识34
3.2 变量的类型和实现35
3.2.1 PHP 5的zval35
3.2.2 PHP 7的zval37
3.2.3 PHP 7变量类型40
3.2.4 整型和浮点型41
3.2.5 字符串类型42
3.2.6 数组43
3.2.7 引用43
3.2.8 间接zval44
3.2.9 常量和常量AST46
3.2.10 资源类型47
3.2.11 对象47
3.3 变量的作用域49
3.3.1 全局变量49
3.3.2 局部变量49
3.3.3 中间变量50
3.3.4 静态变量51
3.3.5 常量51
3.4 对垃圾回收的支持51
3.4.1 gc的基本结构52
3.4.2 引用计数53
3.4.3 循环引用问题55
3.4.4 垃圾回收55
3.5 本章小结63
第4章 字符串64
4.1 字符串的结构64
4.1.1 PHP 7字符串的具体实现65
4.1.2 字符串的二进制安全68
4.1.3 zend_string API69
4.2 智能字符串72
4.2.1 smart_str对比smart_string72
4.2.2 智能字符串的具体实现73
4.2.3 smart_str API75
4.3 进阶76
4.3.1 字符串的赋值与写时分离76
4.3.2 字符串的类别(内部字符串)79
4.3.3 字符串的类型转换84
4.3.4 字符串的双引号与单引号87
4.3.5 PHP常用字符串操作函数实现90
4.4 本章小结92
第5章 数组的实现93
5.1 基本概念93
5.1.1 数组的语义93
5.1.2 数组的概念94
5.2 PHP 5数组的实现95
5.3 PHP 7数组的实现99
5.3.1 基本结构100
5.3.2 初始化105
5.3.3 packed array和hash array的区别114
5.3.4 插入、更新、查找和删除123
5.3.5 哈希冲突的解决130
5.3.6 扩容和rehash操作132
5.3.7 数组的递归保护134
5.4 本章小结135
第6章 面向对象136
6.1 类的种类136
6.1.1 普通类136
6.1.2 抽象类137
6.1.3 接口138
6.1.4 特性140
6.1.5 final类142
6.1.6 匿名类142
6.2 类的特性143
6.2.1 类的属性143
6.2.2 访问控制143
6.3 类的实现144
6.3.1 类的结构144
6.3.2 静态属性、常量和方法149
6.3.3 接口和特性151
6.3.4 继承152
6.4 对象的实现155
6.4.1 实现155
6.4.2 普通属性156
6.5 其他特性157
6.5.1 魔术方法157
6.5.2 自动加载157
6.6 本章小结159
第7章 生命周期160
7.1 基础知识160
7.1.1 信号处理160
7.1.2 SAPI简介164
7.1.3 SAPI核心结构SG(v)166
7.2 CLI模式的生命周期167
7.2.1 模块初始化阶段168
7.2.2 请求初始化阶段175
7.2.3 执行阶段177
7.2.4 请求关闭阶段178
7.2.5 模块关闭阶段179
7.2.6 其他工作180
7.3 FPM模式的生命周期181
7.3.1 多进程管理182
7.3.2 网络编程193
7.3.3 FastCGI协议195
7.4 其他模式200
7.5 本章小结201
第8章 配置文件解析202
8.1 配置文件简介202
8.2 配置基本语法203
8.3 配置文件的加载204
8.4 扩展配置208
8.5 运行时的配置212
8.6 本章小结213
第9章 内存管理214
9.1 内存管理的意义214
9.2 内存管理的准备知识216
9.2.1 基本概念216
9.2.2 内存对齐218
9.3 内存管理的数据结构219
9.3.1 _zend_mm_heap219
9.3.2 _zend_mm_chunk223
9.4 内存管理的详细实现226
9.4.1 内存管理初始化227
9.4.2 内存申请227
9.4.3 内存管理之huge内存229
9.4.4 内存管理之large内存230
9.4.5 内存管理之small内存231
9.5 内存回收234
9.6 本章小结235
第10章 词法和语法分析236
10.1 基础知识236
10.1.1 编译器237
10.1.2 源程序分析237
10.1.3 BNF范式241
10.2 词法与语法分析器242
10.2.1 Lex与YACC242
10.2.2 Re2c与Bison247
10.3 Token类型252
10.4 PHP 7词法与语法相关数据结构253
10.4.1 CG(v)宏253
10.4.2 zend_stack255
10.4.3 zend_ast相关结构255
10.4.4 zend_arena262
10.4.5 zend_parser_stack_elem262
10.5 PHP 7词法与语法分析263
10.5.1 整体过程263
10.5.2 词法与语法分析阶段263
10.6 AST的优势273
10.7 源码中的其他使用275
10.8 本章小结275
第11章 Zend虚拟机276
11.1 基础知识276
11.1.1 Zend虚拟机架构276
11.1.2 符号表278
11.1.3 函数调用栈278
11.1.4 指令280
11.2 相关数据结构281
11.2.1 EG(v)281
11.2.2 符号表281
11.2.3 指令284
11.2.4 指令集288
11.2.5 执行数据290
11.2.6 执行栈291
11.3 AST编译过程294
11.3.1 op_array初始化 294
11.3.2 AST编译295
11.3.3 设置指令handler307
11.4 执行过程308
11.4.1 执行栈分配309
11.4.2 初始化execute_data309
11.4.3 调用hanlder函数执行311
11.4.4 释放execute_data315
11.5 其他调度方式315
11.6 本章小结316
第12章 基本语法实现317
12.1 条件判断317
12.2 循环语句322
12.2.1 foreach语句322
12.2.2 while语句324
12.2.3 for语句327
12.2.4 do while语句329
12.3 中断与跳转331
12.3.1 break的实现331
12.3.2 goto的实现335
12.4 文件引入338
12.5 异常/错误处理339
12.6 本章小结343
第13章 函数实现344
13.1 基础知识 344
13.2 用户定义函数的编译345
13.3 用户定义函数的执行352
13.4 内置函数358
13.4.1 内置函数的注册358
13.4.2 内置函数的执行360
13.5 本章小结360
第14章 扩展361
14.1 扩展的实现原理362
14.2 PHP扩展363
14.2.1 扩展的实现363
14.2.2 JSON扩展366
14.3 Zend扩展367
14.3.1 Zend扩展的实现367
14.3.2 opcache扩展369
14.4 自定义扩展378
14.4.1 初始化379
14.4.2 编译配置380
14.4.3 功能实现381
14.4.4 注册配置项383
14.4.5 编译、安装385
14.5 本章小结386
附录A php.ini配置项说明387
附录B Token与opcode含义对应表413
序 Foreword
PHP 7的推出,主打的是性能提升,而且几乎可以让旧版本无缝地升级,这让很多公司直接受益,也激起了不少人探索的欲望。
作为互联网时代运用广泛的语言之一,PHP实战方面的书层出不穷,也不乏很多经典之作,但关于PHP内核分析的书少之又少。PHP入门简单,但要看懂内部源码却需要非常深厚的功底,这也是PHP的特性,PHP 7内核分析的书可以大幅度地降低分析PHP内部细节的门槛。
这本书的特点是:它是集体的智慧,是从学习过程中沉淀下来的,所以内容相对更接地气,也更简单易懂。比如详细介绍zval结构体中每个字段的含义和作用,并和PHP 5对比zal的变化,而且还延伸出了不少C的基础(如结构体和联合体、内存结构的布局),内容也很全面,从PHP的基本语法,到生命周期、具体的执行过程以及PHP的“心脏”Zend虚拟机都有详细的分析,所以更适合纯PHP程序员。他们看完这本书,大体能知道一段代码经过了什么样的流程,然后被机器执行,终输出结果,对程序员来讲,有种真正把控一切的爽快感。
这本书也有很多实用的内容,不仅有PHP的内部实现,还详细介绍了所有opcode的意义、php.ini配置选项的作用,这些可能都可以直接应用在现有程序上,让程序变得更好。
我很欣喜地看到,不管是PHP官方,还是社区,都有很多的PHP程序员在不断突破,所以才有了PHP 7、有了Swoole,也有了更多关于PHP进阶的书,相信以后还会有更多。
后,研读本书,相信你的PHP水平一定会有一个飞跃。
王晶(半桶水)
滴滴出行高级架构师
Preface 前 言
为什么要写这本书
工作了10多年,一直没有想过要写一本书。一年前,团队的张晶晶同学建议,我们能不能组织大家每天一起学习和讨论,这样也许会成长得更快。当时我感觉这是一个非常好的建议,但是也有隐隐的担忧,因为根据经验,多个人一起学习很难长期持续。但是看到晶晶同学渴望的眼神,我决定试一试,于是我建立了一个学习圈,发给团队的同事们,他们可以自愿参加,学习的时间是每天早上8:50~10:30,正好不影响工作,但是早晨要提前100分钟来公司,学习的内容是研读工作中使用的LNMP源码,首先学习和研究的就是PHP 7的源码。出乎意料,团队几乎所有的同事都参加了这个学习圈,包括实习生。
而这个学习圈一直坚持到现在,真是风雨无阻,大家已经习惯了按时一起讨论、研究,遇到问题时大家各自查找相关资料,顿悟难题时大家欣喜若狂。令我欣喜的是,学习圈的同事们的快速成长,后来我们这个学习圈加入了滴滴公司的学习圈,得到了更多的资源支持。在学习过程中,我们每天都会记录日志,时间久了,发现得到了一个丰富的知识库,于是大家提议,写一本书,这样我们决定写一本PHP 7源码学习和研究的书,希望我们整理的资料能够帮助有意愿研究PHP 7源码的读者。
做了这个决定后,学习圈里的李长林、李志、黄桃、肖涛、王坤、季伟滨、朱栋和我一起编写了这本书,大家在工作之外,每天写书到深夜,周末从此是路人,经过半年的编写和校对,终于完成了这本书。我们希望给那些想要了解PHP 7底层实现的读者一些启发,帮助更多的人理解PHP 7的实现,也希望能够传播这种坚持学习的精神。
读者对象
PHP工程师
对PHP内部实现感兴趣的读者
有C语言基础的读者
其他对PHP语言感兴趣的人
如何阅读本书
本书内容上分为四篇,共计14章内容。
篇(第1~2章)介绍PHP 7的概况和源码整体框架。其中,第1章主要介绍PHP的历史和PHP 7的新特性,以及研读源码的方法,第2章介绍PHP 7源码的整体框架,包括各目录的源码和功能。
第二篇(第3~6章)详细介绍PHP 7的变量实现。其中,第3章介绍基本变量zval的结构,第4章详细阐述字符串zend_string的实现,第5章介绍PHP 7中的核心结构HashTable的实现,也就是数组的实现,第6章介绍类和对象的实现。
第三篇(第7~11章)介绍PHP 7核心的实现。其中,第7章主要的内容是PHP 7的生命周期,第8章介绍生命周期的模块初始化阶段中配置文件的解析,第9章主要阐述内存管理的原理和实现,第10章介绍词法和语法分析的实现,第11章介绍核心Zend虚拟机的实现。
第四篇(第12~14章)主要介绍PHP 7中语法的实现。其中,第12章主要介绍基本语法的实现,第13章主要介绍函数的实现,第14章主要讲解扩展的实现。
其中,第3章、第4章、第5章和第14章为本书的重点章节,如果你没有充足的时间完成全书的阅读,可以选择性地进行重点章节的阅读。如果你是一位有着一定经验的资深人员,本书可能会是一本不错的案头书。然而,如果你是一名初学者,在开始本书阅读之前,建议先进行一些C语言和PHP的基础理论知识的学习。
勘误和支持
由于笔者的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果你有更多的宝贵意见,欢迎加入我们,访问我们团队的技术网站https://segmentfault.com/u/php7internal进行专题讨论,我们会尽量在线上为读者提供满意的解答。同时,你也可以通过微博@PHP7内核,或者邮箱[email protected]联系到我们,期待能够得到你们的真挚反馈,在技术之路上互勉共进。
致谢
感谢卢红波、伍星两位工作导师的支持,前者是我在滴滴公司的领导,也是我管理和技术上的导师,后者是我职业生涯的启蒙导师,一直引领我前进到现在。
感谢Swoole团队韩天峰、王晶两位兄弟的指导和支持,他们在技术上给了我非常多的指点。
感谢李长林、李志、黄桃、肖涛、王坤、季伟滨、朱栋7位兄弟在学习和研究过程中的陪伴和合作,本书是几位兄弟共同合作的结晶。
特别致谢
后,我要特别感谢我的太太梦云、儿子和女儿,为写作这本书,我牺牲了很多陪伴他们的时间,但也正因为有了他们的付出与支持,我才能坚持写下去。
同时,感谢我的父母、岳父岳母,特别是我的父母,不遗余力地帮助我们照顾儿女,有了他们的帮助和支持,我才有时间和精力去完成写作工作。
另外要感谢我团队的兄弟们,感谢他们的坚持,为他们的成长点赞!
后要重点感谢高婧雅编辑,得益于她的耐心审稿,宝贵的建议以及用心的修改,才进一步提升了本书的质量。
谨以此书献给我亲爱的家人,以及众多热爱PHP的朋友!
陈 雷
PHP的代码量不小,对很多从事Web开发的人来说,这本书是很好的参考和学习指引。相信读者认真学习后会对PHP语言甚至各种语言有新一层次的认知,也能够更好地完成自己的目标,也期待有更多的人能加入到改进优化PHP语言的行列中。
——夏绪宏,PHP官方开发组成员、TIPI作者
本书的特别之处是,它是一个技术团队的PHP内核源码学习笔记,书中内容是整个团队学习、思考、交流的结果。正在学习PHP内核源码的开发者可以将本书作为参考资料,结合本书内容可以更快更深入地理解PHP内核实现原理。
——韩天峰,车轮互联总架构师、Swoole创始人
本书对PHP 7内核源码分析得非常详尽,从基础代码查看方式,到源码内部数据结构扩展开发等都非常翔实,阐述了包括基本架构、各种数据结构、配置文件、GC、扩展开发等各类非常基础的PHP 7内核机制实现,也有大量的代码分析,特别适合有一定C语言基础、爱好PHP内核学习的工程师参考学习。
——谢华亮(黑夜路人)
很高兴陈雷能将他和团队的学习心得与成果出版,也很荣幸*时间阅读了一些章节,给了一些建议。我相信这是一本来自于大并发实战前沿的,饱含满满诚意的作品。那些做PHP开发的人,如果想从“知其然”做到“知其所以然”,这本书是不可不读的书籍。
——伍星,BitCV CEO
评论
还没有评论。