当前位置:首页 > 网站程序 > php > 正文内容

php-fpm是什么?如何重启?工作原理是怎么样的?

yangxin2年前 (2022-12-03)php309

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

在介绍运行原理之前,我们先了解下它的几种运行模式。

运行模式

php-fpm支持三种运行模式,分别为static、ondemand、dynamic,默认为dynamic 。

static:静态模式,启动时分配固定的worker进程。

ondemand:按需分配,当收到用户请求时fork worker进程。

dynamic:动态模式,启动时分配固定的进程。伴随着请求数增加,在设定的浮动范围调整worker进程。

这三种模式各有千秋,大家可以根据不同的环境调整相应的配置。

下面进入本文主题,着重介绍php-fpm运行原理。

运行原理

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

master进程

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

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进程分为 接收客户端请求、处理请求、请求结束三个阶段。

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性能优异的原因之一。


分享给朋友:

“php-fpm是什么?如何重启?工作原理是怎么样的?” 的相关文章

极致CMS安装后访问出现提示“No input file specified.”

极致CMS安装后访问出现提示“No input file specified.”问题极致CMS安装成功后,访问出现提示“No input file specified.”,无法访问网站。解决方法这种情...

Pbootcms面包屑标签位置标签首页换成英文home的方法

Pbootcms面包屑标签位置标签首页换成英文home的方法://修改首页文本为 Home{pboot:position indextext=Home}//自定义分隔符为 / {pboot:...

PbootCMS date时间标签如何单独调用年月日

首页/列表标签:普通调用方法:列表页时间:[list:date] 效果:2021-12-06 09:12:30调用年月日:列表页时间:[list:date style=Y-m-d] 效果:2021-1...

eyoucms易优CMS后台升级报错 /core/library/think/db/Connection.php 第 389 行左右解决办法与出现原因

  最近在帮朋友对一个eyoucms程序进行搬家的时候遇到了一个问题:报错 /core/library/think/db/Connection.php 第 389 行左右  数据表或视图不存在,请联系...

帝国cms程序版本号如何查看?如何查看帝国cms程序是什么版本的?

  最近在给一个朋友的网站被黑了,在修改朋友的网站的时候,发现他的后台没有版本号,被别人给修改了成了别的。为此,只能通过查看代码来获得帝国cms程序的版本号。帝国cms程序版本号查看方法如下:  方法...

卢松松博客用什么做的?卢松松博客用的什么程序搭建的?

  最近,有一个朋友问我:卢松松博客用的什么程序搭建的?为此,我专门去看了卢松松的博客,根据的博客更新的发展历程发现:  2006年4月到2009.03.21之间用的是OBLOG。  2009.03....

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。