当前位置: 首页 > 后端技术 > PHP

PHP架构和生命周期

时间:2023-03-29 17:12:34 PHP

SAPI是ServerApplicationProgrammingInterface,即服务器应用程序编程接口。它定义了一个统一的接口,供外部应用程序与PHP通信。常见的SAPI协议版本有:CGICommonGatewayInterface,即通用网关接口。因为服务器不能直接和PHP交互,所以需要有一个转换过程。CGI定义了这种转换的规则。当一个请求来到服务器时,Web服务程序会使用CGI协议将请求转换成PHP可以理解的信息。,PHP返回信息时,也是通过CGI协议进行转换的FastCGIFastCGI是CGI协议的升级版,主要是将CGI解释器进程保存在内存中,从而获得高性能。FastCGI更像是一个C/S架构的软件,通过tcp接受请求,所以实现FastCGI的软件更适合分布式部署CLIPHPCommandLineInterface,即命令行操作界面。用于解释命令行PHP脚本Apache2handler也称为模块模式,它将PHP注册为Apache模块运行。这样PHP就和Apache一起启动运行了。它是Apache基于CGI的扩展,可以加快PHP的运行效率。ISAPI5.3之后删除了InternetServerApplicationProgramInterface,这是微软专门为IIS开发的协议。仅适用于Windows。它实现了CGI的所有功能并对其进行了扩展,比如提供了一个过滤器API。大多数ISAPI应用程序都是以DLL动态库的形式加载的。处理完用户请求后,就可以等待下一个用户请求了。另外,ISAPDLL应用程序和WEB服务器在同一个进程中,效率明显高于CGI。这种方式最大的缺点就是稳定性不好。当PHP出现问题时,WEB服务器的进程也会挂掉。Embed为嵌入式,可用于C\C++调用PHP函数。Fuzzer似乎用于源代码审计。Litespeed很少被人使用。它是一个用于PHP代码调试的付费WEB服务器phpdbg。它在功能上类似于gdb。PHP-CGI是PHP提供的实现CGI协议的程序。更改的配置需要重启才能生效。PHP-FPM提供了一个实现Fast-CGI协议的程序。它不会像PHP-CGI那样每次都重启一个进程,处理完成后关闭进程。相反,它允许一个进程处理多个连接,并在进程完成后等待下一个请求。PHP-FPM常驻内存,会开启多个PHP-CGI程序,而一个PHP-CGI基本要消耗7~25M内存,所以连接数过多会导致内存消耗过大。PHP中CGI的实现本质是通过Socket编程实现一个TCP或UDP协议的服务器。启动时为TCP/UDP协议服务器创建socket监听器,接受相关请求进行处理。这只是请求的处理。在此基础上加上SAPI初始化、模块初始化、模块关闭、SAPI关闭等,就构成了整个CGI生命周期。SAPI经历了几个阶段。ModuleInit调用各个扩展PHP_MINIT_FUNCTION中的方法初始化模块,进行一些变量申请,内存分配等。RequestInit接受请求后调用各个扩展PHP_RINIT_FUNCTION中的方法,初始化PHP脚本的执行环境,执行PHP脚本请求关机。此时调用各个扩展PHP_RSHUTDOWN_FUNCTION中的方法清理请求站点,ZE开始回收变量和内存模块。ShutdownWEB服务器退出或命令脚本执行后退出,会调用各个扩展PHP_MSHUTDOWN_FUNCTION中的方法。单进程SAPI生命周期CLI/CGI模式的PHP属于单进程SAPI模式。这种请求处理一次就会关闭多进程SAPI生命周期。通常PHP会被编译成apache的一个模块来处理PHP请求。Apache一般采用多进程模式。Apache启动后,会fork出多个子进程,每个子进程的内存空间是独立的,每个子进程都会经过start和end环节。每个进程的开始阶段只有在进程fork出来后才进行。在整个进程的生命周期中,可能只有在apache关闭或者进程结束后才会处理多个请求。执行关闭阶段,在这两个阶段之间,每个请求都会重复启动-请求-请求关闭阶段。多线程SAPI生命周期多线程和模式类似于多进程中的一个进程,不同的是整个进程是Hu生命周期会并行重复请求开始-请求结束链接。在这种模式下,只有一个服务器进程在运行,但同时有多个线程在运行。这样可以减少一些资源开销,像Moduleinit,Moduleshutdown只需要运行一次,一些全局变量只需要初始化一次,因为线程的特性使得请求之间共享一些数据成为可能。参考PHP内核了解:生命周期与运行模式·PHPer进阶·kancloud(kancloud.cn)