所有知识点都是通过《PHP7内核剖析》书籍整理
需要详细完整的知识请购买正版图书进行阅读
PHP基础架构
底层垃圾回收原理
zval的介绍,及PHP7中的改变
php变量的结构zval中有一个比较重要的成员:refcount__gc,它记录变量的引用计数。引用计数是PHP实现变量自动 回收的基础,也就是记录一个变量有多少个地方在使用的一种机制。PHP5.X的版本引用计数是在zval中而不是在具体的value中,这样导致变量复制时需要多复制两个结构,zval、zvalue_value始终绑定在一起。PHP7将引用计数转移到了具体的value中,这样更合理。因为zval只是变量的载体,可以简单地认为是变量名,而value才是真正的值,这个改变使得PHP变量之间的复制、传递更加简洁、易懂。
后面会更进
异常处理
php5.X中很多操作会直接抛出error错误,PHP7中将多数错误改为了异常抛出,这样一来就可以通过try catch捕捉到,例如:
try{
test();
} catch(Throwable $e) {
echo $e->getMessage();
}
脚本中调用一个不存在的函数php5.X会直接报error错误,中断程序。PHP7中可以通过Throwable异常类型进行捕获。就的异常处理方式使得错误处理更加可控。
收获:在不知道这个特性的时候一度以为try catch没有什么用处,原本希望的是可以在代码异常或者报错的情况下不至于程序挂掉,但是实际使用中却并不理想,一直没有去查看为什么,后来在swoft框架后,查看同事代码的时候发现在try catch中的代码挂掉以后居然没有报错,而是到抛出了异常并合理的处理掉了。直到此时了解后才知道,PHP7中改进了异常处理。
PHP的构成
SAPI
Server Application Programming Interface 的首字母缩写,意思是服务器端应用编程接口。
PHP内核提供给外部调用其他服务的接口,即外部系统可以通过 SAPI 来调用 PHP 提供的编译脚本、执行脚本的服务。比如说Cli、Fpm等等
ZendVM
ZendVM是一个虚拟的计算机,他介于PHP应用和实际计算机中间,我们编写的PHP代码就是通过它来解释和执行的。
主要分成两部分:编译器和执行器。
编译器负责把我们编写的PHP代码编译成机器可以识别的指令,执行器负责执行这些指令。
其他细节部分往后有时间在补充。
main
PHP的主要代码,主要是输入输出、web通信、已经PHP框架的初始化操作等,比如fastcgi协议的解析、扩展的加载、PHP配置的解析等工作都是由他来完成的。它位于ZendVM的上层。
EXTension
PHP的扩展部分
生命周期
PHP的生命周期可以划分为这几个阶段:
模块初始化阶段(module startup)
请求初始化阶段(request startup)
执行脚本阶段(execute script)
请求关闭阶段(request shutdown)
模块关闭阶段(module shutdown)
根据不同的SAPI的实现,各阶段的执行情况会有一些差异,比如说Cli会完整的经历这几个阶段,而fastCgi模式在启动是会执行一次模块初始化,然后在各个请求只经历请求初始化、执行脚本、请求关闭三个阶段,在SAPI关闭的时候经历模块关闭阶段。
SAPI
Cli
Cli(Command Line Interface),即命令行接口,用于在命令下执行PHP脚本。
Cli模式通过执行编译的PHP二进制程序即可启动,它定义了很多命令行参数,不同的参数对应不同的处理,比如:执行PHP脚本文件、直接执行PHP代码(-r 参数)、输出 PHP版本(-v 参数)、输出已安装的扩展(-m 参数)、指定php.ini配置(-c 参数)…直接在PHP命令后加PHP脚本则将执行该脚本。
// 执行php脚本
$ php script.php
太复杂的就不记录了,这是记录一些常用的知识
cli下参数的使用:argc和argv是什么(直接贴了别人的原文地址)