共计 1976 个字符,预计需要花费 5 分钟才能阅读完成。
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)