概述

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 运行原理分析的更多相关文章

  1. Camel运行原理分析

    Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...

  2. tensorflow运行原理分析(源码)

    tensorflow运行原理分析(源码)  https://pan.baidu.com/s/1GJzQg0QgS93rfsqtIMURSA

  3. 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化

    QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...

  4. browserify运行原理分析

    目前对于前端工程师而言,如果只针对浏览器编写代码,那么很简单,只需要在页面的script脚本中引入所用js就可以了. 但是某些情况下,我们可能需要在服务端也跑一套类似的逻辑代码,考虑如下这些情景(以n ...

  5. Java程序运行原理分析

    class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时 ...

  6. springboot创建,自动装配原理分析,run方法启动

    使用IDEA快速创建一个springboot项目 创建Spring Initializr,然后一直下一步下一步直至完成 选择web,表示创建web项目 运行原理分析 我们先来看看pom.xml文件 核 ...

  7. 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles

    老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles   poptest是国内唯一一家培养测试开 ...

  8. 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源

    老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...

  9. 老李推荐:第5章3节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动脚本

    老李推荐:第5章3节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 启动脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  10. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用   上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...

随机推荐

  1. redis 简单整理——阻塞问题[二十五]

    前言 简单介绍一下redis的阻塞问题. 正文 Redis是典型的单线程架构,所有的读写操作都是在一条主线程中完成 的.当Redis用于高并发场景时,这条线程就变成了它的生命线.如果出现 阻塞,哪怕是 ...

  2. 重新点亮linux 命令树————服务管理工具[二十五]

    前言 简单整理一下服务管理工具. 正文 服务集中管理工具. service 功能简单 systemctl 功能多 先来看下service脚本位置: 然后看下vim network 这里可以看到代码非常 ...

  3. 记一次 .NET某炉膛锅炉检测系统 崩溃分析

    一:背景 1. 讲故事 上个月有个朋友在微信上找到我,说他们的软件在客户那边隔几天就要崩溃一次,一直都没有找到原因,让我帮忙看下怎么回事,确实工控类的软件环境复杂难搞,朋友手上有一个崩溃的dump,刚 ...

  4. 10个常用的JS工具库,80%的项目都在用

    高手区别于普通人的重要一点是,他们善于利用工具,把更多的时间留给了规划和思考.写代码也是同样的道理,工具用好了,你就有更多的时间来规划架构和攻克难点.今天就给大家分享一下当前最流行的 js 工具库,如 ...

  5. vue-cli4.0 (vue3.0 的脚手架)

    前言: 这个搭建脚手架的话实际是我们创建一个新项目的第一步,当然,现在脚手架4.0都出来了,经过使用后发现跟我们之前的3.0使用方法是答题一样的,其中用vue-cli3.0来搭建我们的项目的话又分为两 ...

  6. 力扣1127(MySQL)-用户购买平台(困难)

    题目: 支出表: Spending 这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端('desktop')和手机端('mobile')的应用程序.这张表的主键是 (user_ ...

  7. 「开源人说」|AI普惠,阿里灵杰开源历程与思考

    简介: 施兴 阿里巴巴资深技术专家 阿里巴巴开源项目EasyRec负责人 以下为开发者社区「开源人说」第四期--大数据&AI专场的主题分享,点击链接了解更多精彩详情 https://devel ...

  8. 性能透明提升 50%!SMC + ERDMA 云上超大规模高性能网络协议栈

    简介: 新的协议栈是不是重新发明轮子?一个协议栈能否解决所有问题?适配所有场景? 编者按:当前内核网络协议栈有什么问题?新的协议栈是不是重新发明轮子?一个协议栈能否解决所有问题?适配所有场景?本文整理 ...

  9. Dataphin核心功能(四):安全——基于数据权限分类分级和敏感数据保护,保障企业数据安全

    简介:<数据安全法>的发布,对企业的数据安全使用和管理提出了更高的要求.Dataphin提供基于数据分级分类和数据脱敏的敏感数据识别和保护能力,助力企业建立合规的数据安全体系,保障企业数据 ...

  10. 【详谈 Delta Lake 】系列技术专题 之 湖仓一体( Lakehouse )

    简介: 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章.众所周知,Databricks 主导着开源大数据社区 Apache Spark.Delta L ...