当前位置:首页 > CN2资讯 > 正文内容

PHP源码分析 - PHP-FPM运行原理php-fpm

9小时前CN2资讯


我们知道web服务器与PHP应用之间通过SAPI接口进行交互数据。PHP提供了多种SAPI接口,例如 apache2hander、fastcgi、cli等等。当然,php-fpm也是其中一种。相比其他接口,php-fpm运用更加广泛。

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



    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/26512.html

    分享给朋友:

    “PHP源码分析 - PHP-FPM运行原理php-fpm” 的相关文章

    ColoCrossing数据机房评测:高性能VPS和安全保障让业务更高效

    ColoCrossing是一家在美国市场上已有多年历史的数据机房提供商。我在了解这家公司时,深深被它在数据托管领域的地位所吸引。实际上,ColoCrossing提供的服务不止是简单的服务器租用,他们一手打造了多个高质量的数据中心,涵盖了VPS及服务器托管等业务。随着最近他们在爱尔兰都柏林新增了机房,...

    主机类型与高性能配置详解,选择最适合你的主机方案

    主机的定义与分类 什么是主机? 当我们谈论“主机”这个词时,通常指的是计算机系统,特别是在网络环境中提供服务或资源的设备。我个人觉得主机不仅仅是实体的机器,而是指在网络中扮演着重要角色的一种技术资源。它可以执行各种任务,从存储数据到托管网站,再到运行应用程序,主机的功能几乎无所不包。可以想象,主机就...

    RackNerd优惠活动详解:如何享受高性价比虚拟主机和VPS折扣

    RackNerd是一家在2019年成立的美国主机商。虽然成立时间不久,它却迅速在市场上崭露头角,赢得了许多VPS用户的青睐。公司的数据中心分别位于洛杉矶、圣何塞、西雅图和纽约等地,这些地理位置的选择让它的服务在各个区域都有稳定的覆盖。从我个人的体验来说,RackNerd的性价比非常高,尤其在价格和服...

    详细指南:如何进行Linux扩容以解决存储不足问题

    什么是Linux扩容? 在使用Linux操作系统时,随着数据的增加,我们常常面临磁盘空间不足的问题。Linux扩容就是通过添加新的磁盘、扩展现有磁盘容量或利用逻辑卷管理(LVM)等方式,来增加系统的存储空间。扩容可以帮助我更好地管理数据,提高服务器的运行效率。 我记得第一次接触扩容时,面对不断增加的...

    RackNerd Windows VPS的硬件条件与性能评测

    在选择虚拟服务器服务商时,硬件条件是我最关注的部分。RackNerd作为一家提供多种配置Windows VPS的服务商,其硬件条件非常吸引。接下来,我将详细介绍RackNerd在硬件配置方面的一些关键特点。 处理器配置 RackNerd使用的AMD Ryzen 3900X处理器,让人印象深刻。这个处...

    Vultr DD Windows安装教程:轻松一步到位

    在云计算越来越流行的今天,Vultr作为一个强大的云服务提供商,吸引了大量用户。对于想在Vultr服务器上安装Windows的用户来说,使用DD命令是一种非常便利的方法。接下来,我将为你详细介绍如何通过这一方式在Vultr上安装Windows。 1.1 使用DD命令直接安装Windows 1.1.1...