目 录 前言 第1章 PHP基本架构 1.1 PHP简介 1.2 PHP7的改进 1.3 FPM 1.3.1 概述 1.3.2 基本实现 1.3.3 FPM的初始化 1.3.4 请求处理 1.3.5 进程管理 1.4 PHP执行的几个阶段 第2章 变量 2.1 变量的内部实现 2.2 数组 2.3 静态变量 2.4 全局变量 2.5 常量 第3章 Zend虚拟机 3.1 PHP代码的编译 3.1.1 词法解析、语法解析 3.1.2 抽象语法树编译流程 3.2 函数实现 3.2.1 内部函数 3.2.2 用户函数的实现 3.3 Zend引擎执行流程 3.3.1 基本结构 3.3.2 执行流程 3.3.3 函数的执行流程 3.3.4 全局execute_data和opline 3.4 面向对象实现 3.4.1 类 3.4.2 对象 3.4.3 继承 3.4.4 动态属性 3.4.5 魔术方法 3.4.6 类的自动加载 3.5 运行时缓存 3.6 Opcache 3.6.1 opcode缓存 本文档使用 看云 构建 - 2 - 3.6.2 opcode优化 3.6.3 JIT 第4章 PHP基础语法实现 4.1 类型转换 4.2 选择结构 4.3 循环结构 4.4 中断及跳转 4.5 include/require 4.6 异常处理 第5章 内存管理 5.1 Zend内存池 5.2 垃圾回收 第6章 线程安全 6.1 什么是线程安全 6.2 线程安全资源管理器 第7章 扩展开发 7.1 概述 7.2 扩展的实现原理 7.3 扩展的构成及编译 7.3.1 扩展的构成 7.3.2 编译工具 7.3.3 编写扩展的基本步骤 7.3.4 config.m4 7.4 钩子函数 7.5 运行时配置 7.5.1 全局变量 7.5.2 ini配置 7.6 函数 7.6.1 内部函数注册 7.6.2 函数参数解析 7.6.3 引用传参 7.6.4 函数返回值 7.6.5 函数调用 7.7 zval的操作 7.7.1 新生成各类型zval 7.7.2 获取zval的值及类型 7.7.3 类型转换 7.7.4 引用计数 7.7.5 字符串操作 7.7.6 数组操作 7.8 常量 7.9 面向对象 本文档使用 看云 构建 - 3 - 7.9.1 内部类注册 7.9.2 定义成员属性 7.9.3 定义成员方法 7.9.4 定义常量 7.9.5 类的实例化 7.10 资源类型 7.11 经典扩展解析 7.8.1 Yaf 7.8.2 Redis 第8章 命名空间 8.1 概述 8.2 命名空间的定义 8.2.1 定义语法 8.2.2 内部实现 8.3 命名空间的使用 8.3.1 基本用法 8.3.2 use导入 8.3.3 动态用法 附录 break/continue按标签中断语法实现 defer推迟函数调用语法的实现 一起线上事故引发的对PHP超时控制的思考 本文档使用 看云 构建 - 4 - 前言 前言 本书内容 来自 github 作者是 盘古大叔(pangudashu) 盘古大叔的 github 主页是:https://github.com/pangudashu 本书的 github 地址是: https://github.com/pangudashu/php7-internal 为什么要在 看云 写这本书? 因为我感觉这本书写的不错,但是在 github 上看起来很是不方便,所以就决定放到 看云 上,方便更多的人 查看,了解 php内核。 向 盘古大叔 致敬!,也希望喜欢这本书的,多给 盘古大叔 打星星。 本文档使用 看云 构建 - 5 - 第1章 PHP基本架构 第1章 PHP基本架构 1.1 PHP简介 1.2 PHP7的改进 1.3 FPM 1.4 PHP执行的几个阶段 本文档使用 看云 构建 - 6 - 1.1 PHP简介 1.1 PHP简介 1.1 PHP概述 1.1.1 PHP的历史发展 PHP是一种非常流行的高级脚本语言,尤其适合Web开发,快速、灵活和实用是PHP最重要的特点。PHP自1995 年由Lerdorf创建以来,在全球得到了非常广泛的应用。 在1995年早期以Personal Home Page Tools (PHP Tools) 开始对外发表第一个版本,Lerdorf写了一些介绍此程 序的文档,并且发布了PHP1.0。在这早期的版本中,提供了访客留言本、访客计数器等简单的功能,之后越来越 多的网站开始使用PHP,并且强烈要求增加一些特性,在新的成员加入开发行列之后,Rasmus Lerdorf 在1995 年6月8日将 PHP/FI 公开发布,希望可以通过社群来加速程序开发与寻找错误。这个发布的版本命名为 PHP 2, 已经有今日 PHP 的一些雏型,像是类似 Perl 的变量命名方式、表单处理功能、以及嵌入到 HTML 中执行的能 力。程序语法上也类似 Perl,有较多的限制,不过更简单、更有弹性。PHP/FI加入了对MySQL的支持,从此建 立了PHP在动态网页开发上的地位。到了1996年底,有15000个网站使用 PHP/FI。 在1997年,任职于 Technion IIT 公司的两个以色列程序设计师:Zeev Suraski 和 Andi Gutmans,重写了PHP 的解析器,成为PHP3的基础,而 PHP 也在这个时候改称为PHP:Hypertext Preprocessor,1998年6月正式发 布 PHP 3。Zeev Suraski 和 Andi Gutmans 在 PHP 3 发布后开始改写 PHP 的核心,这个在1999年发布的解析 器称为 Zend Engine,他们也在以色列的 Ramat Gan 成立了 Zend Technologies 来管理 PHP 的开发。 在2000年5月22日,以Zend Engine 1.0为基础的PHP 4正式发布,2004年7月13日则发布了PHP 5,PHP 5则使 用了第二代的Zend Engine。PHP包含了许多新特色:完全实现面向对象、引入PDO、以及许多性能方面的改进。 目前PHP5.X仍然是应用非常广泛的一个版本。 1.1.2 特性 PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法,丰富的语法支持、同时支持面向对象、面向过 程,相比C、Java等语言具有语法简洁、使用灵活、开发效率高、容易学习等特点。 开源免费:PHP社群有大量活跃的开发者贡献代码 快捷:程序开发快,运行快,技术本身学习快,实用性强 效率高:PHP消耗相当少的系统资源,自动gc机制 类库资源:有大量可用类库供开发者使用 扩展性:允许用户使用C/C++扩展PHP 跨平台:可以在unix、windows、max os等系统上面使用PHP 1.1.3 PHP的相关组成 1.1.3.1 SAPI 本文档使用 看云 构建 - 7 - 1.1 PHP简介 PHP本身可以理解为是一个库函数,提供语言的编译与执行服务,它有标准的输入、输出,而SAPI是PHP的接入 层,它接收用户的请求,然后调用PHP内核提供的一些接口完成PHP脚本的执行,所以严格意义上讲SAPI并不算 PHP内核的一部分。 PHP的角色就好比是leveldb,它实现了基本存储功能,但是没有网络处理模块,而我们基于leveldb实现的完整 存储服务就好比是SAPI。 PHP中常用的SAPI有cli、php-fpm,cli是命令行下执行PHP脚本的实现: bin/php script.php ,它是单 进程的,处理模型比较简单,而php-fpm相对比较复杂,它实现了网络处理模块,用于与web服务器交互。 1.1.3.2 Zend引擎 Zend是PHP语言实现的最为重要的部分,是PHP最基础、最核心的部分,它的源码在/Zend目录下,PHP代码从 编译到执行都是由Zend完成的,后面章节绝大部分的源码分析都是针对Zend的。Zend整体由两个部分组成: 编译器: 负责将PHP代码编译为抽象语法树,然后进一步编译为可执行的opcodes,这个过程相当于GCC的 工作,编译器是一个语言实现的基础 执行器: 负责执行编译器输出的opcodes,也就是执行PHP脚本中编写的代码逻辑 1.1.3.3 扩展 本文档使用 看云 构建 - 8 - 1.2 PHP7的改进 1.2 PHP7的改进 本文档使用 看云 构建 - 9 - 1.3 FPM 1.3 FPM 1.3.1 概述 1.3.2 基本实现 1.3.3 FPM的初始化 1.3.4 请求处理 1.3.5 进程管理 本文档使用 看云 构建 - 10 - 1.3.1 概述 1.3.1 概述 1.3.1 概述 FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器,从它的定义可以看出,FPM的核 心功能是进程管理,那么它用来管理什么进程呢?这个问题就需要从FastCGI说起了。 FastCGI是Web服务器(如:Nginx、Apache)和处理程序之间的一种通信协议,它是与Http类似的一种应用层通 信协议,注意:它只是一种协议! 前面曾一再强调,PHP只是一个脚本解析器,你可以把它理解为一个普通的函数,输入是PHP脚本。输出是执行 结果,假如我们想用PHP代替shell,在命令行中执行一个文件,那么就可以写一个程序来嵌入PHP解析器,这就 是cli模式,这种模式下PHP就是普通的一个命令工具。接着我们又想:能不能让PHP处理http请求呢?这时就涉 及到了网络处理,PHP需要接收请求、解析协议,然后处理完成返回请求。在网络应用场景下,PHP并没有像 Golang那样实现http网络库,而是实现了FastCGI协议,然后与web服务器配合实现了http的处理,web服务器 来处理http请求,然后将解析的结果再通过FastCGI协议转发给处理程序,处理程序处理完成后将结果返回给 web服务器,web服务器再返回给用户,如下图所示。 PHP实现了FastCGI协议的解析,但是并没有具体实现网络处理,一般的处理模型:多进程、多线程,多进程模 型通常是主进程只负责管理子进程,而基本的网络事件由各个子进程处理,nginx、fpm就是这种模式;另一种 多线程模型与多进程类似,只是它是线程粒度,通常会由主线程监听、接收请求,然后交由子线程处理, memcached就是这种模式,有的也是采用多进程那种模式:主线程只负责管理子线程不处理网络事件,各个子 线程监听、接收、处理请求,memcached使用udp协议时采用的是这种模式。 本文档
PHP7内核剖析
计算机 >
PHP >
php >
文档预览
399 页
0 下载
787 浏览
0 评论
0 收藏
3.0分
温馨提示:如果当前文档出现乱码或未能正常浏览,请先下载原文档进行浏览。
本文档由 user 于 2021-10-09 06:12:26上传分享