PHP架构与生命周期

简介: PHP引擎与SAPI

PHP基础架构.png

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

PHP中CGI的实现.png

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模式。这类请求在处理一次后就关闭

PHP单进程SAPI生命周期.png

多进程SAPI生命周期

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

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

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

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

PHP多进程SAPI生命周期.png

多线程SAPI生命周期

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

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

PHP多线程SAPI生命周期.png

参考

目录
相关文章
|
7月前
|
缓存 自然语言处理 PHP
深入PHP内核:理解OPcode和执行生命周期
在PHP的执行过程中,源代码经过词法分析、语法分析等一系列复杂的步骤后,最终会编译成一种叫做“操作码”(OPcode)的中间代码。本文将深入探讨PHP的操作码(OPcode)是什么,它是如何生成的,以及它在整个PHP脚本执行周期中扮演的角色。我们还将了解不同的OPcode优化技术,以及它们如何影响PHP应用程序的性能。通过本文,读者将对PHP的内部工作原理有更深刻的理解,为进一步的性能调优打下坚实的基础。
|
6月前
|
关系型数据库 MySQL PHP
PHP的生命周期:从诞生到现代Web开发
本文将探索PHP的发展历程,从其最初的设计目标到成为现代Web开发的核心语言。我们将深入了解PHP如何适应不断变化的技术环境,并保持其在开发者社区中的受欢迎程度。
|
2月前
|
架构师 安全 程序员
为什么大部分 PHP 程序员做不了架构师?
【10月更文挑战第23天】本文分析了PHP程序员向架构师转型时面临的挑战,包括语言特性限制认知范围、缺乏分布式系统经验、性能优化深度不足、安全意识和安全架构能力不足,以及对其他技术栈的融合能力有限等问题。这些问题限制了PHP程序员在系统设计和架构领域的全面发展。
|
4月前
|
设计模式 算法 PHP
深入理解PHP中的数组操作探索编程之美:从代码到架构的思维转变
【8月更文挑战第24天】在PHP编程中,数组是基础且强大的数据结构。本文将通过浅显易懂的方式,介绍如何在PHP中高效地操作数组,包括创建、遍历、排序和过滤等常见任务。无论你是初学者还是有经验的开发者,这篇文章都会带给你新的启示。 【8月更文挑战第24天】在编程的世界中,代码不仅仅是冰冷的字符排列,它承载着思想、解决问题的智慧和创新的灵魂。本文将通过个人的技术感悟,带领读者从编写单一功能的代码片段出发,逐步深入到整个软件架构的设计哲学,探索如何将代码块转化为高效、可维护和可扩展的系统。我们将一起见证,当代码与架构思维相结合时,如何引发技术实践的革命性飞跃。
|
5月前
|
Cloud Native PHP Docker
PHP 中的异常处理:提升代码的健壮性云原生时代的微服务架构实践
【7月更文挑战第31天】在PHP开发中,异常处理是确保应用程序稳定性和可靠性的关键。本文将引导您了解如何在PHP中实现有效的异常处理机制,通过实际代码示例展示如何捕获和处理异常,以及如何使用自定义异常类来增强错误管理的灵活性。我们将探索不同的异常处理策略,并讨论它们对提升代码质量的影响。 【7月更文挑战第31天】在数字化浪潮的推动下,云原生技术正成为企业转型的关键。本文将深入探讨如何在云平台上利用微服务架构实现敏捷开发和高效运维,通过具体的代码示例,揭示微服务与容器化部署的协同优势,同时指出在实施过程中可能遇到的挑战及应对策略。
38 1
|
4月前
|
JavaScript 前端开发 PHP
探索PHP的未来之路:从Web开发到现代架构的演变
【8月更文挑战第22天】随着技术的不断演进,PHP作为一门历史悠久的编程语言,其发展路径和未来趋势值得我们深入探讨。本文将带您了解PHP如何适应现代化的Web开发需求,以及它在新兴技术栈中的位置,从而揭示PHP在不断变化的技术生态中的持续重要性。
53 0
|
7月前
|
数据库连接 PHP
深入PHP内核:理解Zend Engine和PHP生命周期
【5月更文挑战第4天】 在本文中,我们将探讨PHP的核心——Zend Engine。我们会详细解释Zend Engine的工作原理,以及它如何驱动PHP代码的执行。此外,我们还将深入讨论PHP生命周期的各个阶段,包括从请求开始到输出结果的整个过程。这篇文章将为你提供一个深入的理解,关于PHP如何处理你的代码,以及它在背后是如何运作的。
169 3
|
7月前
|
XML JSON PHP
PHP的生命周期:从诞生到现代Web开发
【5月更文挑战第31天】探索PHP的历史演变,了解其如何塑造网络技术。本文将引导您穿越时间的长廊,见证一个编程语言如何适应不断变化的技术需求,并持续影响全球数百万开发者和用户。
|
7月前
|
运维 Linux Apache
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
287 2
|
7月前
|
消息中间件 PHP 数据库
【PHP开发专栏】PHP在微服务架构中的应用
【4月更文挑战第29天】微服务架构将大型应用拆分成独立小服务,PHP在其中可作为API网关、微服务提供者,参与服务发现、消息队列处理和事件驱动。最佳实践包括选择合适PHP框架、使用容器化技术、定义服务契约、采用分布式缓存、实现服务发现、监控和日志收集、优化数据库设计以及注重安全性。遵循这些实践,PHP开发者能构建高效、可扩展的微服务应用。
123 0