乐趣区

关于php:PHP架构与生命周期

SAPI

SAPI 就是 Server Application Programming Interface, 即服务器利用编程接口。它定义了一个对立的接口,提供给内部应用程序与 PHP 通信。

常见 SAPI 协定版本有:

  1. CGI

    Common Gateway Interface, 即通用网关接口。因为服务器并不能间接与 PHP 交互,所以须要有个转换的过程,CGI 就是定义了这个转换的规定

    当一个申请来到服务端的时候,web 服务程序会应用 CGI 协定将申请转换成 PHP 能了解的信息,PHP 返回信息的时候也是通过 CGI 协定来转换

  2. FastCGI

    FastCGI 是 CGI 协定的升级版,次要是将 CGI 解释器过程放弃在内存中并因而取得高性能。

    FastCGI 更多的是像一个 C / S 架构软件,通过 tcp 承受申请,因此实现了 FastCGI 的软件更适宜分布式部署

  3. CLI

    PHP Command Line Interface, 即命令行运行接口。用于解释命令行 PHP 脚本

  4. Apache2handler

    也被称为模块模式,将 PHP 注册成 Apache 模块的形式来运行。这种形式 PHP 是随 Apache 一起启动并运行,它是 Apache 在 CGI 的根底上进行的扩大,能够放慢 PHP 的运行效率

  5. ISAPI 5.3 当前删除

    Internet Server Application Program Interface,是微软开发专门用于 IIS 的协定,只能在 Windows 上应用。它实现了 CGI 所有的性能并进行了扩大,如提供了过滤器利用程序接口。

    ISAPI 利用大多数以 DLL 动静库的模式加载,解决完用户的申请后能够期待下一个用户申请,另外 ISAP 的 DLL 应用程序和 WEB 服务器处于同一过程中,效率显著高于 CGI

    这种形式最大的毛病就是稳定性不好,PHP 呈现问题的时候 WEB 服务器的过程也会挂掉

  6. Embed

    嵌入式,能够供 C\C++ 调用 PHP 函数的能力

  7. Fuzzer

    如同是用于源码审计的,不太确定,相干材料好少

  8. litespeed

    很少有人用,它是免费的 WEB 服务器

  9. 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 都通过的几个阶段

  1. Module Init

    调用每个扩大的 PHP_MINIT_FUNCTION 中的办法初始化模块,进行一些变量申请、内存调配等。

  2. Request Init

    承受申请后调用每个扩大的 PHP_RINIT_FUNCTION 中的办法,初始化 PHP 脚本的执行环境

  3. 执行 PHP 脚本
  4. Request Shutdown

    这时候调用每个扩大的 PHP_RSHUTDOWN_FUNCTION 中的办法,清理申请现场,并且 ZE 开始回收变量、内存

  5. Module Shutdown

    WEB 服务器退出或命令脚本执行结束退出就会调用每个扩大的 PHP_MSHUTDOWN_FUNCTION 中的办法

单过程 SAPI 生命周期

CLI/CGI 模式的 PHP 属于单过程 SAPI 模式。这类申请在解决一次后就敞开

多过程 SAPI 生命周期

通常 PHP 是编译为 apache 的一个模块来解决 PHP 申请

Apache 个别会采纳多过程模式,Apache 启动后会 fork 出多个子过程,每个子过程的内存空间独立,每个子过程都会通过开始和完结环节

每个过程的开始阶段只在过程 fork 进去当前进行,在整个过程的生命周期内可能会解决多个申请

只有在 apache 敞开或过程被完结之后才会进行敞开阶段,在这两个阶段之间会随着每个申请反复申请开始 - 申请敞开环节

多线程 SAPI 生命周期

多线和模式和多过程中的某个过程相似,不同的是在整个过程胡生命周期内会并行的反复着 申请开始 - 申请完结 环节

在这种模式下,只有一个服务器过程在运行,但同时会运行多个线程。这样能够缩小一些资源开销,像 Modeule initModule shutdown 就只须要运行一遍就行了,一些全局变量也只须要初始化一次,因为线程的特质使得申请之间共享一些数据成为可能

参考

  • PHP 内核理解:生命周期及运行模式 · PHPer 进阶 · 看云 (kancloud.cn)
退出移动版