php fpm工作原理,什么是phpfpm的工作原理?

什么是phpfpm的工作原理?

发布时间:2020-07-13 15:12:53

来源:亿速云

阅读:181

作者:Leah

什么是phpfpm的工作原理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

php-fpm是一种master(主)/worker(子)多进程架构,与nginx设计风格有点类似。master进程主要负责CGI及PHP环境初始化、事件监听、子进程状态等等,worker进程负责处理php请求。

运行原理

php-fpm采用master/worker架构设计,前面简单地描述master和worker进程模块的功能。下面将详细讲解这两个模块的运行原理。

master进程

master进程工作流程分为4个阶段,如下图:

7d7b9e4d0a4d7a4550331ea0b300e8de.png

1、cgi初始化阶段:分别调用fcgi_init()和 sapi_startup()函数,注册进程信号以及初始化sapi_globals全局变量。

2、 php环境初始化阶段:由cgi_sapi_module.startup 触发。实际调用php_cgi_startup函数,而php_cgi_startup内部又调用php_module_startup执行。

php_module_startup主要功能:

a)、加载和解析php配置;

b)、加载php模块并记入函数符号表(function_table);

c)、加载zend扩展 ;

d)、设置禁用函数和类库配置;

e)、注册回收内存方法;

3、php-fpm初始化阶段:执行fpm_init()函数。负责解析php-fpm.conf文件配置,获取进程相关参数(允许进程打开的最大文件数等),初始化进程池及事件模型等操作。

4、php-fpm运行阶段:执行fpm_run() 函数,运行后主进程发生阻塞。该阶段分为两部分:fork子进程和循环事件。

fork子进程部分交由fpm_children_create_initial函数处理( 注:ondemand模式在fpm_pctl_on_socket_accept函数创建)。

循环事件部分通过fpm_event_loop函数处理,其内部是一个死循环,负责事件的收集工作。

worker进程

worker进程分为 接收客户端请求、处理请求、请求结束三个阶段。

5f4e49f2d23ceffe8fd38bd0cce58c4a.png

1、接收客户端请求:执行fcgi_accept_request函数,其内部通过调用accept函数获取客户端请求。//请求锁

FCGI_LOCK(req->listen_socket);

req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len);

//释放锁

FCGI_UNLOCK(req->listen_socket);

从上面的代码,可以注意到accept之前有一个请求锁的操作,这么设计是为了避免请求出现“惊群”的现象。当然,这是一个可选的选项,可以取消该功能。

2、处理请求阶段:首先,分别调用fpm_request_info、php_request_startup获取请求内容及注册全局变量($_GET、$_POST、$_SERVER、$_ENV、$_FILES);然后根据请求信息调用php_fopen_primary_script访问脚本文件;最后交给php_execute_script执行。php_execute_script内部调用zend_execute_scripts方法将脚本交给zend引擎处理。

3、请求结束阶段:执行php_request_shutdown函数。此时 回调register_shutdown_function注册的函数及__destruct()方法,发送响应内容、释放内存等操作。

总结

php-fpm采用master/worker架构设计, master进程负责CGI、PHP公共环境的初始化及事件监听操作。worker进程负责请求的处理功能。在worker进程处理请求时,无需再次初始化PHP运行环境,这也是php-fpm性能优异的原因之一。

关于什么是phpfpm的工作原理?问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#对象映射器之Mapster

简介Mapster是一个快,小巧,功能强大的对象映射.Net框架例子我有两个Model类且他们的属性一致,我们将 SourceObjectTest赋值给DestObjectTest该怎么做?SourceObjectTest sourceObject new SourceObjectTest(); sourceObject.Name …

如何关闭Struts2的webconsole.html

出于安全目的,在禁用了devMode之后,仍然不希望其他人员看到webconsole.html页面,则可以直接删除webconsole.html 的源文件, 它的位置存在于: 我们手工删除 struts2-core-*.jar\org\apache\struts2\interceptor\debuggi…

UIView 的基础

UIView•什么是控件?-屏幕上的所有UI元素都叫做控件,也有人叫做视图、组件-按钮(UIButton)、文本(UILabel)都是控件•控件的共同属性有哪些?-尺寸-位置-背景色-......-•苹果将控件的共同属性都…

记录平时编程或者阅读英文文档的时候不认识的英文单词

一、目的 英语虽然过了4级,但是还是很多英文单词不认识,为了以后能更好的阅读英文文档和函数的英文注释,记录自己不认识的英文单词,方便以后复习,这里后面会持续更新,因为放在网上这个平台不会弄丢。 二、…

php本地的调试安装,教你本地安装、运行、调试PHP程序

安装工具对学习PHP的新手来说,WINDOWS下环境配置是一件很困难的事;至少对于我来说本地调试PHP程序比登天还要困难,繁荣拖沓的各种程序。以前我博客程序用的是PJBLOG,本地的IIS就完全可以搞定,但是自从换了WordPress之后…

如何从一个 C# 的 dump 中挖到机器相关的信息?

前段时间有位朋友问我,如何从 dump 中提取出哪些和机器相关的信息?比如:机器内存大小,cpu核数,机器名,机器的环境变量 等等。那如何提取到里面的信息呢?当然我也没说全部可以提取的到。。。这里…

9.3磁盘及文件系统管理详解

练习:4 调整其预留百分比为3%#tune2fs -m 3 -L DATA /dev/sda75 以重新挂载此文件系统为不更新访问时间戳,并验证其效果#stat /backup/inittab# cat /backup/inittab# stat# mount -o remount,noatime /backup# cat # stat6 对此文件系统强行做一次检测e…

LeetCode() Word Search II

超时&#xff0c;用了tire也不行&#xff0c;需要再改。 class Solution {class TrieNode { public:// Initialize your data structure here.TrieNode() {for(int i0;i<26;i)next[i]NULL;isString false;}TrieNode *next[26];bool isString; };class Trie { public:Trie()…

java之通过FileChannel实现文件复制

1、FileChanel介绍 Java NIO FileChannel是连接文件的通道&#xff0c;从文件中读取数据和将数据写入文件。Java NIO FileChannel类是NIO用于替代使用标准Java IO API读取文件的方法。 FileInputStream的getChannel方法获取的文件通道是只读的&#xff0c;当然通过FileOutput…

Python版的Hello World

print “Hello World” 或者print("Hello World")

如何获取当前C#程序所有线程的调用栈信息 ?

咨询区 Daniel Sperry请问如何获取 .NET 程序当前所有线程的调用栈信息&#xff1f;我知道在 java 中只需调用 java.lang.Thread.getAllStackTraces() 方法即可。回答区 Will Calderwood在 .NET 中并不容易实现&#xff0c;但可以使用诊断库 ClrMD &#xff0c;可以在 nuget 上…

JS

为什么80%的码农都做不了架构师&#xff1f;>>> function getQueryString(name) {var reg new RegExp("(^|&)" name "([^&]*)(&|$)"),r window.location.search.substr(1).match(reg);if(r ! null) {return unescape(r[2]); }r…

织梦php远程连接数据库,用PHP连接Oracle for NT 远程数据库

用PHP连接Oracle for NT 远程数据库发布时间&#xff1a;2016-06-17 来源&#xff1a; 点击:次我以前用php连接远程oracle8.0.5 for NT 企业版,用ODBC,oracle接口均不行。急煞我也&#xff01;寻寻觅觅&#xff0c;终于找到了连接的正确方法&#xff0c;我这里用OCI接口&#x…

ssh公钥免密码登录

2019独角兽企业重金招聘Python工程师标准>>> ssh 无密码登录要使用公钥与私钥。linux下可以用用ssh-keygen生成公钥/私钥对&#xff0c;下面我以CentOS为例。 有机器A(192.168.1.155)&#xff0c;B(192.168.1.181)。现想A通过ssh免密码登录到B。 首先以root账户登陆…

java之Synchronized(锁住对象和锁住代码)

1、问题 Synchronized我们一般都知道是锁&#xff0c;但是我们怎么区分是锁对象还是锁代码呢&#xff1f; 2、测试Demo package leetcode.chenyu.test;public class Synchronized {class Test {public synchronized void testFirst() {print("testFirst");}public…

Spring4Shell的漏洞原理分析

Spring框架最新的PoC这两天出来的一个RCE漏洞&#xff0c;但是有以下的条件限制才行&#xff1a;必须是jdk9及以上必须是部署在tomcat的应用是springmvc的或者webflux的应用具体的可以查看spring官方&#xff1a;https://spring.io/blog/2022/03/31/spring-framework-rce-early…

ArcGIS Python

1.遍历指定文件夹下的Grid格式的Raster import arcpy arcpy.env.workspace "D:\GLC_2000\China_gridv3\Grid" rasters arcpy.ListRasters("*", "GRID") for raster in rasters:print(raster) 结果&#xff1a; china_v3 china_v3_pro 2.遍…

php 点对点,浅析点对点(End-to-End)的场景文字识别

一、背景随着智能手机的广泛普及和移动互联网的迅速发展&#xff0c;通过手机等移动终端的摄像头获取、检索和分享资讯已经逐步成为一种生活方式。基于摄像头的(Camera-based)的应用更加强调对拍摄场景的理解。通常&#xff0c;在文字和其他物体并存的场景&#xff0c;用户往往…

spring boot aop 记录方法执行时间

了性能调优&#xff0c;需要先统计出来每个方法的执行时间&#xff0c;直接在方法前后log输出太麻烦&#xff0c;可以用AOP来加入时间统计 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ao…