• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP架构与生命周期

php 搞java代码 3年前 (2022-08-01) 39次浏览 已收录 0个评论

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)

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP架构与生命周期

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址