PHP-FPM 运行原理分析
概述
PHP-FPM 是一种 Master / Worker 多进程运行模式,进程的数量可以通过 php-fpm.conf 进行具体的配置。
Master 进程主要负责 CGI、PHP 环境的初始化、事件循环、监听子进程状态等。
Woker 主要负责处理 PHP 的请求。
PHP-FPM 运行模式
PHP-FPM 支持三种运行模式,分别是 静态模式 static、按需模式 ondemand、动态模式 dynamic。
- static 静态模式
直接开启指定数据量的 PHP-FPM 进程,不再增加或者减少。
启动固定数量的进程,占用内存高。
但是在用户请求波动大的时候,对 Linux 系统的处理耗费的系统资源底。
- ondemand 按需模式
PHP-FPM 的 Master 不会 Fork 任何的子进程,只有收到用户请求时才会 fork worker 进程,这种模式很少使用。
因为它基本无法适应由一定量级的线上业务,由于 PHP-FPM 是短连接,所以每次请求都会先建立连接。
在大流量的系统上 Master 进程会变得非常繁忙,占用系统 CPU 资源,不适合大流量环境的部署。
- dynamic 动态模式
启动时分配固定的进程,随着请求数的变化,在设定的浮动范围调整 worker 进程。
开启一定数量的 PHP-FPM 进程,当请求量变大的时候,动态增加 PHP-FPM 进程数量达到上限,当空闲的时候自动释放空闲进程数到下一个下限。
会根据 max、min、idle children 配置,动态的调整进程数量。
在用户请求波动较大,或者瞬间请求量变大的时候,会进行大量进程的创建和销毁操作,而引起 Linux 系统的负载增高。
运行原理
PHP-FPM 使用 master/worker 架构设计。
Master 进程
CGI 初始化阶段
分别调用 fcgi_init() 函数 和 sapi_start_up() 函数,注册进程信号以及初始化 sapi_globals 全局变量。
PHP 环境初始化阶段
由 cgi_sapi_module.start_up 触发,实际上调用 php_cgi_start_up 函数,而 php_cgi_start_up 内部又调用 php_module_start_up 执行。
php_module_start_up 主要功能包括:
1、加载和解析 PHP 配置文件。
2、加载 PHP 模块并记入函数符号表 (function_table)。
3、加载 Zend 扩展。
4、设置禁用函数和类库配置。
5、注册回收内存方法。
PHP-FPM 初始化阶段
执行 fpm_init() 函数,负责解析 php-fpm.conf 文件配置,获取进程相关参数,例如:允许进程打开的最大文件数。
初始化进程池及事件模型等操作。
PHP-FPM 运行阶段
执行 fpm_run() 函数,运行后主进程发送阻塞。
此阶段包括 fork 子进程和事件循环两个部分:
1、fork 子进程交由 fpm_children_create_initial 函数处理。
2、事件循环通过 fpm_event_loop 函数处理,其内部是一个死循环,负责事件的收集工作。
Worker 进程
woker 进程分为 接收客户端请求、处理请求、请求结束三个阶段。
接收客户端请求
执行 fcgi_accept_request 函数,其内部通过调用 accept 函数获取客户端请求。
处理请求阶段
首先,分别调用 fpm_request_info、php_request_start_up 获取请求内容及注册全局变量($_GET、$_POST、$_SERVER、$_ENV、$FILES)。
然后,根据请求信息调用 php_fopen_primary_script 访问脚本文件。
最后,交给 php_execute_script 执行。执行 php_execute_script 内部调用 zend_execute_scripts 方法将脚本交给 zend 引擎处理。
请求结束阶段
执行 php_request_shutdown 函数,此时回调 register_shutdown_function 注册的函数及 __destruct() 方法,发送响应内容、释放内存等操作。
PHP-FPM 运行原理分析的更多相关文章
- Camel运行原理分析
Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...
- tensorflow运行原理分析(源码)
tensorflow运行原理分析(源码) https://pan.baidu.com/s/1GJzQg0QgS93rfsqtIMURSA
- 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化
QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...
- browserify运行原理分析
目前对于前端工程师而言,如果只针对浏览器编写代码,那么很简单,只需要在页面的script脚本中引入所用js就可以了. 但是某些情况下,我们可能需要在服务端也跑一套类似的逻辑代码,考虑如下这些情景(以n ...
- Java程序运行原理分析
class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时 ...
- springboot创建,自动装配原理分析,run方法启动
使用IDEA快速创建一个springboot项目 创建Spring Initializr,然后一直下一步下一步直至完成 选择web,表示创建web项目 运行原理分析 我们先来看看pom.xml文件 核 ...
- 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles
老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles poptest是国内唯一一家培养测试开 ...
- 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源
老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...
- 老李推荐:第5章3节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动脚本
老李推荐:第5章3节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 启动脚本 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...
随机推荐
- configparser封装后报错:configparser.NoSectionError: No section: 'LoginElement'
前言 这是目录结构 先贴一下源代码 # read_ini.pyimport configparser class ReadIni(): """读取 ini.ini 配置文 ...
- 直播预告丨Hello HarmonyOS进阶课程第三课——游戏开发实践
为了帮助初识HarmonyOS的开发者快速入门,我们曾推出Hello HarmonyOS系列一共5期课程,从最基础的配置IDE和创建Hello World开始,详细介绍HarmonyOS基础.开发环境 ...
- ArkUI框架,更懂程序员的UI信息语法
原文:https://mp.weixin.qq.com/s/LQA6AYiG8O_AeGE1PZwxZg,点击链接查看更多技术内容. ArkUI框架简化代码的"秘密" 在传统 ...
- WPF基础:在Canvas上绘制图形
Canvas介绍 Canvas是WPF(Windows Presentation Foundation)中的一种面板控件,用于在XAML中布置子元素.它提供了绝对定位的能力,允许元素在自由的二维空间中 ...
- 从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
写在开头 随手一翻,发现对于Java中并发多线程的学习已经发布了十几篇博客了,多线程 是Java基础中的重中之重!因此,可能还需要十几篇博客才能大致的讲完这部分的知识点,初学者对于这部分内容一定要多花 ...
- 力扣205(java)-同构字符串(简单)
题目: 给定两个字符串 s 和 t ,判断它们是否是同构的. 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的. 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序 ...
- IT人才能嗑到的这对CP,甜!
简介: 提到文件存储,相信大家都不陌生,在浩瀚的存储发展史中,文件存储无疑是璀璨的,耀眼的.那么,在性能已经成为刚需,自动驾驶行业风起云涌的当下,文件存储与GPU这对CP又有怎样的含糖量呢?今天,我们 ...
- 基于 Wasm 和 ORAS 简化扩展服务网格功能
简介: 本文将介绍如何使用 ORAS 客户端将具有允许的媒体类型的 Wasm 模块推送到 ACR 注册库(一个 OCI 兼容的注册库)中,然后通过 ASM 控制器将 Wasm Filter 部署到指定 ...
- 创新推出 | Serverless 场景排查问题利器:函数实例命令行操作
简介: 实例命令行功能的推出希望能消除用户使用 Serverless 的"最后一公里",直接将真实的函数运行环境展现给用户,此后 Serverless 将不再是一个"黑 ...
- dotnet OpenXML 读取 PPT 主序列进入退出强调动画
本文告诉大家如何读取 PPT 文件里面,放在主动画序列 MainSequence 的进入和退出和强调的动画,和在 OpenXML 里面的存放方式 如以下的课件内容,给一个元素添加了进入强调退出的动画, ...