根据个人的理解,PHP内核结构可以大体分成
SAPI
+main
+Zend
+Ext
+TSRM
- 其中
SAPI
是最外层的,其全称为Server abstraction API
,它是PHP
提供对外服务的规范,主要负责处理输入和输出。 它可以直接对接web
服务器,如Apache
、Nginx
等,接收这种来自Web
服务器的网络请求并返回相应的响应数据。而在cli
运行方式下,它接收的则是命令行的输入,最终也会返回命令行的输出。总的来说它提供一系列的PHP
接口,使得PHP
可以和其他的应用程序进行交互。所以SPAI
并不只有一种,大致有apache2handler
,cgi
,cli
,embed
,fpm
这几种。
apache2handler
:用于Apache
以模块方式运行PHP
的情况。PHP
编译后生成.dll
或.so
扩展,在Apache
中进行配置。Apache
接收到php
的处理请求后调用PHP
扩展进行处理。此处就是进行php
文件解析的入口cgi
:普通CGI
模式下web server
(e.g.Apache
、Nginx
)将满足CGI
协议的请求交给CGI
进程进行处理cli
:php
文件以命令行方式进行调用时候的处理入口embed
:内嵌模式。PHP
是用C
语言编写的,所以可以在C
语言中调用PHP
文件。这种情况下就以此作为入口fpm
:全称为FastCGI Process Manager
,可以理解为CGI
的升级版本,通常在Nginx
下使用。Nginx
依据Fast-CGI
协议将请求交给php-fpm
进行处理
main
层起到了一个承上启下的作用。SAPI
接收输入数据后无法自己处理;Zend
引擎虽然可以执行代码,但是它肯定需要在哪边进行唤起。main
层就在中间起到了一个过度的作用;另外模块的初始化等工作也需要在这边进行;
Zend
引擎是脚本最终解析,执行并得到结果的地方;Ext
作为扩展并不独立存在,它可以理解为Zend
的附属部分;
TSRM
全称是Thread Safe Resource Manager
–线程安全资源管理器。它是保证共享资源的安全的一种机制。