前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP架构与生命周期

PHP架构与生命周期

原创
作者头像
码一
发布2022-05-26 13:12:53
4840
发布2022-05-26 13:12:53
举报
文章被收录于专栏:码园
PHP基础架构.png
PHP基础架构.png

SAPI

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

常见SAPI协议版本有:

  1. CGI

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

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

  1. FastCGI

FastCGI是CGI协议的升级版,主要是将CGI解释器进程保持在内存中并因此获得高性能。

FastCGI更多的是像一个C/S架构软件,通过tcp接受请求,因而实现了FastCGI的软件更适合分布式部署

  1. CLI

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

  1. Apache2handler

也被称为模块模式,将PHP注册成Apache模块的方式来运行。这种方式PHP是随Apache一起启动并运行,它是Apache在CGI的基础上进行的扩展,可以加快PHP的运行效率

  1. <del>ISAPI</del> <sub>5.3以后删除</sub>

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

ISAPI应用大多数以DLL动态库的形式加载,处理完用户的请求后可以等待下一个用户请求,另外ISAP的DLL应用程序和WEB服务器处于同一进程中,效率显著高于CGI

这种方式最大的缺点就是稳定性不好,PHP出现问题的时候WEB服务器的进程也会挂掉

  1. Embed

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

  1. Fuzzer

好像是用于源码审计的,不太确定,相关资料好少

  1. litespeed

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

  1. 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的生命周期。

PHP中CGI的实现.png
PHP中CGI的实现.png

SAPI都经过的几个阶段

  1. Module Init

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

  1. Request Init

接受请求后调用每个扩展的PHP_RINIT_FUNCTION中的方法,初始化PHP脚本的执行环境

  1. 执行PHP脚本
  2. Request Shutdown

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

  1. Module Shutdown

WEB服务器退出或命令脚本执行完毕退出就会调用每个扩展的PHP_MSHUTDOWN_FUNCTION中的方法

单进程SAPI生命周期

CLI/CGI模式的PHP属于单进程SAPI模式。这类请求在处理一次后就关闭

PHP单进程SAPI生命周期.png
PHP单进程SAPI生命周期.png

多进程SAPI生命周期

通常PHP是编译为apache的一个模块来处理PHP请求

Apache一般会采用多进程模式,Apache启动后会fork出多个子进程,每个子进程的内存空间独立,每个子进程都会经过开始和结束环节

每个进程的开始阶段只在进程fork出来以后进行,在整个进程的生命周期内可能会处理多个请求

只有在apache关闭或进程被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭环节

PHP多进程SAPI生命周期.png
PHP多进程SAPI生命周期.png

多线程SAPI生命周期

多线和模式和多进程中的某个进程类似,不同的是在整个进程胡生命周期内会并行的重复着 请求开始-请求结束 环节

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

PHP多线程SAPI生命周期.png
PHP多线程SAPI生命周期.png

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档