问题详情
简要介绍一下 PHP-FPM 运行机制
它的运行机制如下:
1. 当有 PHP 请求到达 Web 服务器时,Web 服务器会将请求转发给 PHP-FPM。
2. PHP-FPM 接收请求后,会创建一个独立的 FastCGI 子进程,并将请求发送到子进程中。
3. 子进程接收请求后,解析执行 PHP 脚本并返回结果给 PHP-FPM。
4. PHP-FPM 将子进程的执行结果返回给 Web 服务器,Web 服务器再返回给客户端。
其中,PHP-FPM 可以通过配置文件来指定子进程的数量、启动方式、进程管理策略等。通过这些配置,我们可以更好地控制 PHP 进程的运行,提高 PHP 处理效率和稳定性,并且避免了 mod_php 的安全隐患。
-
上一篇
简要介绍一下 PHP-FPM 运行机制
<p>我们知道web服务器与PHP应用之间通过SAPI接口进行交互数据。PHP提供了多种SAPI接口,例如 apache2hander、fastcgi、cli等等。当然,php-fpm也是其中一种。相比其他接口,php-fpm运用更加广泛。</p><p><br></p><p>php-fpm是一种master(主)/worker(子)多进程架构,与nginx设计风格有点类似。master进程主要负责CGI及PHP环境初始化、事件监听、子进程状态等等,worker进程负责处理php请求。</p><p><br></p><p>一、<strong>运行方式</strong></p><p>PHP-FPM 支持三种运行模式,分别为 static、ondemand、dynamic,默认为 dynamic 。</p><p><strong>static</strong>: 静态模式,启动时分配固定的 worker 进程。</p><p><strong>ondemand</strong>: 按需分配,当收到用户请求时 fork worker 进程。</p><p><strong>dynamic</strong>: 动态模式,启动时分配固定的进程。伴随着请求数增加,在设定的浮动范围调整 worker 进程。</p><p><br></p><p>二、<strong>运行原理</strong></p><p>php-fpm 采用 master/worker 架构设计,下面简单地描述 master 和 worker 进程模块的功能。下面将详细讲解这两个模块的运行原理。</p><p><strong>master 进程</strong>工作流程分为4个阶段:</p><p>1.cgi 初始化阶段:分别调用 fcgi_init() 和 sapi_startup() 函数,注册进程信号以及初始化 sapi_globals 全局变量。</p><p>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).注册回收内存方法;</p><p>3.php-fpm 初始化阶段:执行 fpm_init() 函数。负责解析 php-fpm.conf 文件配置,获取进程相关参数(允许进程打开的最大文件数等),初始化进程池及事件模型等操作。</p><p>4.php-fpm 运行阶段:执行 fpm_run() 函数,运行后主进程发生阻塞。该阶段分为两部分:fork 子进程 和 循环事件。fork 子进程部分交由 fpm_children_create_initial 函数处理( 注:ondemand 模式在 fpm_pctl_on_socket_accept 函数创建)。循环事件部分通过 fpm_event_loop 函数处理,其内部是一个死循环,负责事件的收集工作。</p><p><br></p><p><strong>worker 进程</strong>分为 接收客户端请求、处理请求、请求结束三个阶段。</p><p>1. 接收客户端请求:执行 fcgi_accept_request 函数,其内部通过调用 accept 函数获取客户端请求。</p><p>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 引擎处理。</p><p>3. 请求结束阶段:执行 php_request_shutdown 函数。此时 回调 register_shutdown_function 注册的函数及 __destruct() 方法,发送响应内容、释放内存等操作。</p><p><br></p><p>三、<strong>总结</strong></p><p>PHP-FPM 采用 master / worker 架构设计, master 进程负责 CGI、PHP 公共环境的初始化及事件监听操作。worker 进程负责请求的处理功能。在 worker 进程处理请求时,无需再次初始化 PHP 运行环境,这也是 PHP-FPM 性能优异的原因之一。</p>
-
下一篇
简要介绍一下 PHP-FPM 运行机制
简要介绍一下 PHP-FPM 运行机制
相关文章
- 聊一下高并发和高性能的区别和联系?
- 如何在Golang中实现单例模式?
- PHP中常用的设计模式有哪些?
- 请解释什么是defer语句,以及它有什么作用?
- 请解释下PHP中会话(session)和Cookie(cookie)的作用。
- 请谈谈您对PHP的垃圾回收机制的了解及实践。
- 如何在Golang中进行并发编程?
- PHP7和PHP5的性能上有什么差别?
- 请举例说明PHP中如何处理异常?
- 请给一个例子解释一下PHP中的闭包函数是什么?
- 在PHP中,Magic Method都有哪些,并举例说明它们的作用?
- PHP中如何进行单元测试以及如何在开发过程中保证代码质量?
- 请提供至少三个通过PHP实现的网站性能优化技巧。
- 请解释HTTP的基本概念,以及在Golang中如何使用HTTP?
- 如何通过PHP来保护您的代码免受SQL注入攻击?
- 请列出与PHP相关的缓存机制及其优缺点。
- 请描述在Golang中使用MongoDB时的最佳实践。
- 请解释一下PHP中的MVC模式是如何工作的?
- PHP中如何处理文件上传和下载?
- 请问PHP中如何实现多线程?
微信收款码
支付宝收款码