PHP7内核剖析
  • 推荐2
  • 收藏1
  • 浏览288

PHP7内核剖析

秦朋 (作者) 

  • 书  号: 978-7-121-32810-7
  • 出版日期:2017-11-01
  • 页  数:492
  • 开  本:16(185*235)
  • 出版状态:上市销售
纸质版 ¥89.00

相关图书

Effective Debugging英文版:调试软件与系统的66个有效方法

Diomidis Spinellis (作者) (希腊)Diomidis Spinellis (季奥米季斯·斯宾奈里斯) (译者)

本书作者着眼于一系列可能会在现代软件系统中出现的问题,特别是分散在地球上的组件和服务之间复杂的相互影响造成的问题。无论您是否正在调试独立运行的错误或灾难性的企业...

¥75.00

零起点Python足彩大数据与机器学习实盘分析

何海群 (作者)

本书采用Python编程语言、Pandas数据分析模块、机器学习和人工智能算法,对足彩大数据进行实盘分析。设计并发布了开源大数据项目zc-dat足彩数据包,汇总...

¥69.00

零起点Python机器学习快速入门

何海群 (作者)

本书采用独创的黑箱模式,MBA案例教学机制,结合一线实战案例,介绍Sklearn人工智能模块库和常用的机器学习算法。书中配备大量图表说明,没有枯燥的数学公式,普...

¥39.00

高性能PHP 7

(巴基斯坦)Altaf Hussain (作者) 吕毅 (译者)

《高性能PHP 7》从PHP所需环境讲起,涉及环境搭建与配置设置等内容,能够帮助有一定计算机基础的读者实现PHP运行环境的搭建及PHP周边软件的安装配置。《高性...

¥45.00

跟老齐学Python:轻松入门

齐伟 (作者)

Python是一种被广泛用于网站开发、数据处理和机器学习等领域的高级编程语言,同时也是一种学习门槛较低的高级编程语言。本书是Python语言的入门读物,旨在引导...

¥36.00

零起点:Python大数据与量化交易

何海群 (作者)

本书是国内较早关于Python大数据与量化交易的原创书籍,配合zwPython、zwQuant开源量化软件学习,已经是一套完整的大数据分析、量化交易学习教材,可...

¥79.00
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的创始人韩天峰老师,本项目有幸得到韩老师的推荐,得到了众多人的关注。另外要单独感谢陈晓猛编辑,在他耐心地指导、审稿、修改工作下,最终才有了本书的诞生。

秦朋

目录

第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 小结

本书勘误

印次
  • 页码:第10章  •  行数:整章  •  印次: 1

    箭头改为->

    陈晓猛 提交于 2017/12/13 10:40:41
    陈晓猛 确认于 2017/12/13 10:40:52
  • 页码:2  •  行数:27  •  印次: 1

    增加一行代码 $ make && make install

    陈晓猛 提交于 2017/12/13 10:27:29
    陈晓猛 确认于 2017/12/13 10:41:54
  • 页码:2  •  行数:-7  •  印次: 1

    增加一行代码 $ make && make install

    陈晓猛 提交于 2017/12/13 10:28:44
    陈晓猛 确认于 2017/12/13 10:29:59
  • 页码:50  •  行数:5  •  印次: 1

    【nTableSize】改为【nTableMask】

    陈晓猛 提交于 2017/12/13 10:31:11
    陈晓猛 确认于 2017/12/13 10:31:47
  • 页码:52  •  行数:-9  •  印次: 1

    【((uint32_t))(ht->arData)】改为【((uint32_t)(ht->arData))】

    陈晓猛 提交于 2017/12/13 10:33:06
    陈晓猛 确认于 2017/12/13 10:41:48

读者评论