SAPI
SAPI就是Server Application Programming Interface,即服务器利用编程接口。它定义了一个对立的接口,提供给内部应用程序与PHP通信。
常见SAPI协定版本有:
CGI
Common Gateway Interface,即通用网关接口。因为服务器并不能间接与PHP交互,所以须要有个转换的过程,CGI就是定义了这个转换的规定
当一个申请来到服务端的时候,web服务程序会应用CGI协定将申请转换成PHP能了解的信息,PHP返回信息的时候也是通过CGI协定来转换
FastCGI
FastCGI是CGI协定的升级版,次要是将CGI解释器过程放弃在内存中并因而取得高性能。
FastCGI更多的是像一个C/S架构软件,通过tcp承受申请,因此实现了FastCGI的软件更适宜分布式部署
CLI
PHP Command Line Interface, 即命令行运行接口。用于解释命令行PHP脚本
Apache2handler
也被称为模块模式,将PHP注册成Apache模块的形式来运行。这种形式PHP是随Apache一起启动并运行,它是Apache在CGI的根底上进行的扩大,能够放慢PHP的运行效率
ISAPI5.3当前删除Internet Server Application Program Interface,是微软开发专门用于IIS的协定,只能在Windows上应用。它实现了CGI所有的性能并进行了扩大,如提供了过滤器利用程序接口。
ISAPI利用大多数以DLL动静库的模式加载,解决完用户的申请后能够期待下一个用户申请,另外ISAP的DLL应用程序和WEB服务器处于同一过程中,效率显著高于CGI
这种形式最大的毛病就是稳定性不好,PHP呈现问题的时候WEB服务器的过程也会挂掉
Embed
嵌入式,能够供C\C++调用PHP函数的能力
Fuzzer
如同是用于源码审计的,不太确定,相干材料好少
litespeed
很少有人用,它是免费的WEB服务器
phpdbg
用于PHP代码调试,跟gdb性能相似
PHP-CGI
由PHP提供实现了CGI协定的程序,每个申请都会开启一个php-cgi过程来解决,如果更改了配置须要重启能力失效
PHP-FPM
有PHP提供实现了Fast-CGI协定的程序,它不会像PHP-CGI一样每次都从新开启一个过程,解决实现之后就敞开这个过程。而是容许一个过程对多个连贯进行解决,解决实现之后会期待下一个申请。PHP-FPM是常驻内存的,会开启多个PHP-CGI程序,而一个PHP-CGI根本耗费7~25M内存,因而连贯过多就会导致内存耗费过大
PHP中CGI的实现
其本质是以socket编程实现一个TCP或UDP协定的服务器。当启动时,创立TCP/UDP协定服务器的socket监听,并承受相干申请进行解决。这只是申请的解决,在此基础上增加SAPI初始化、模块初始化、模块敞开、SAPI敞开等就形成了整个CGI的生命周期。
SAPI都通过的几个阶段
Module Init
调用每个扩大的
PHP_MINIT_FUNCTION
中的办法初始化模块,进行一些变量申请、内存调配等。Request Init
承受申请后调用每个扩大的
PHP_RINIT_FUNCTION
中的办法,初始化PHP脚本的执行环境- 执行PHP脚本
Request Shutdown
这时候调用每个扩大的
PHP_RSHUTDOWN_FUNCTION
中的办法,清理申请现场,并且ZE开始回收变量、内存Module Shutdown
WEB服务器退出或命令脚本执行结束退出就会调用每个扩大的
PHP_MSHUTDOWN_FUNCTION
中的办法
单过程SAPI生命周期
CLI/CGI模式的PHP属于单过程SAPI模式。这类申请在解决一次后就敞开
多过程SAPI生命周期
通常PHP是编译为apache的一个模块来解决PHP申请
Apache个别会采纳多过程模式,Apache启动后会fork出多个子过程,每个子过程的内存空间独立,每个子过程都会通过开始和完结环节
每个过程的开始阶段只在过程fork进去当前进行,在整个过程的生命周期内可能会解决多个申请
只有在apache敞开或过程被完结之后才会进行敞开阶段,在这两个阶段之间会随着每个申请反复申请开始-申请敞开环节
多线程SAPI生命周期
多线和模式和多过程中的某个过程相似,不同的是在整个过程胡生命周期内会并行的反复着 申请开始-申请完结 环节
在这种模式下,只有一个服务器过程在运行,但同时会运行多个线程。这样能够缩小一些资源开销,像Modeule init
、Module shutdown
就只须要运行一遍就行了,一些全局变量也只须要初始化一次,因为线程的特质使得申请之间共享一些数据成为可能
参考
- PHP内核理解:生命周期及运行模式 · PHPer进阶 · 看云 (kancloud.cn)