SAPI,我特地查了一下,是ServerApplicationProgrammingInterface的缩写,意思是服务器端应用程序编程接口。这是PHP内核为外部调用其服务提供的接口,即外部系统可以通过SAPI调用PHP提供的编写脚本和执行脚本的服务。PHP实现的SAPI有很多,比较常见的有Cli和Fpm。从下图中可以清楚的了解到外部系统是如何通过SAPI调用PHP服务的。图片来自网络。接下来主要讨论一下我们常用的Cli和Fpm是如何工作的。CliCli(CommandLineInterface),即命令行界面,用于在命令行下执行PHP脚本,就像Shell一样,是执行PHP脚本最简单的方式。Cli是单进程模式。它在处理完请求后直接关闭。生命周期经历模块启动、请求启动、执行脚本、请求关闭、模块关闭。执行过程比较简单。关键处理流程如下:main()->php_cli_startup()->do_cli()->php_module_shutdown()FpmFpm(FastCGIProcessManager)是PHPFastCGI运行方式的进程管理器。从它的定义可以看出,Fpm的核心功能是进程管理。FastCGI是Web服务器(如Nginx、Apache)和处理程序之间的通信协议。它是一种类似于HTTP的应用层通信协议。注意:这只是一个协议!fpm是多进程模型,由一个master进程和多个worker进程组成。master进程启动时,会创建一个socket,但不会接收和处理请求,而是由fork出来的worker子进程完成请求的接收和处理。即master进程管理worker进程,worker进程才是真正的处理请求。Fpm启动后,首先会进行SAPI注册操作;然后会进入PHP生命周期的模块启动阶段,在这个阶段会调用各个扩展定义的MINT钩子函数。然后会进行一系列的初始化操作,最后master和worker进程会进入不同的处理环节。worder进程的生命周期如下图所示:图片来自网络。它的生命周期主要经历这几个阶段:等待请求、解析请求、请求初始化、执行PHP脚本、关闭请求。master进程主要通过三种不同的方式管理worder进程,分别是静态模式(static)、动态模式(dynamic)和按需模式(ondemand)。使用哪种模式可以通过pm在conf配置中指定。
