对php-fpm的理解重述
来源:互联网 发布:ant编译java 编辑:程序博客网 时间:2024/05/22 11:57
目录
- 目录
- CGI的出现
- FastCGI
- php-fpm
- 摘录
- FPM的请求处理流程
- nginx转发请求给FPM
- 参考
CGI的出现
早期的Web服务器只能处理HTML等静态文件,随着PHP等动态语言的出现,Web Server无法进行处理。为解决Web Server处理PHP的问题,Web Server可以将其转交给PHP解释器进行处理。那么,问题就转变为:如何解决Web Server同PHP解释器的通信?
于是,CGI协议便出现了。它解决 不同语言解释器(如PHP解释器)与WebServer的通信问题。CGI是Web Server与后台语言交互的协议,具有语言无关性。开发者可以按照CGI协议的要求使用任何语言编写程序,就能实现语言解释器同Web Server的通信。如php-cgi程序。
尽管如此,但是我们发现,CGI中存在着一个致命的问题:为处理每次请求均需要fork出一个全新的CGI进程,请求处理完成后又将进程kill掉。具体过程如下:
当Web Server接收到请求,如请求PHP时,发现自身处理不了,会启动对应的CGI程序。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,最后退出进程。Web Server收到结果后将其返回给浏览器。
每次请求都需要fork出一个进程出来,然后让PHP解析器解析php.ini文件,初始化执行环境,处理请求,最后将进程kill掉。显然,从高并发、资源占用、效率的角度来说,这种方式是不太合理的。
FastCGI
于是,FastCGI出现了。顾名思义,这是CGI的一个改进,“更快的”CGI。在FastCGI中,请求处理完毕后,不会立即kill掉处理请求的进程,而是保留该进程,等待处理下一次请求。它允许在一个进程内处理多个请求。并不是一个请求fork出一个进程,这在性能上得到了很大的提高。
php-fpm
php-fpm便是FastCGI协议的具体实现,提供了进程管理的功能。在php-fpm中,采用了master/worker架构设计,分为master进程和worker进程。其中master进程只有一个,负责CGI、PHP公共环境的初始化、监听端口,接收来自 Web Server 的请求;而worker进程则一般有多个(具体数据根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。在worker进程处理请求时,无需再次初始化PHP运行环境,这也是php-fpm性能优异的原因之一。
摘录
来源: 深入理解PHP之:Nginx 与 FPM 的工作机制
FPM的请求处理流程
从 FPM 接收到请求,到处理完毕,其具体的流程如下:
1. FPM 的 master 进程接收到请求2. master 进程根据配置指派特定的 worker 进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合 Nginx 遇到502错误比较多的原因。3. worker 进程处理请求,如果超时,返回504错误4. 请求处理结束,返回结果
nginx转发请求给FPM
nginx 提供了 fastcgi 模块来将 http 请求映射为对应的 fastcgi 请求。nginx 的 fastcgi 模块提供了 fastcgi_param 指令来主要处理这些映射关系。具体见原文。
参考
- Nginx+Php-fpm运行原理详解
- PHP源码分析 - PHP-FPM运行原理
- 搞不清FastCgi与PHP-fpm之间是个什么样的关系
- 深入理解PHP之:Nginx 与 FPM 的工作机制
- 对php-fpm的理解重述
- 重述PHP工作原理及需要注意的小知识点
- 关于CGI、fastcgi、PHP-CGI、PHP-FPM的理解
- 理解CGI、FCGI、php-cgi、php-fpm的概念
- cgi fastcgi php-cgi php-fpm mod_php之间的理解
- PHP cgi fastcgi & php-fpm 的关系以及理解
- 深入理解PHP之:Nginx 与 FPM 的工作机制
- 深入理解 PHP 之:Nginx 与 FPM 的工作机制
- 深入理解PHP之:Nginx 与 FPM 的工作机制
- php-fpm和cgi及并发响应的理解
- php-fpm的作用
- php-fpm的作用
- linux的php-fpm
- php-fpm的作用
- php-fpm的设置
- 理解CGI、FastCGI、PHP-CGI、PHP-FPM
- 快速理解 FastCGI、PHP-CGI、PHP-FPM
- 关于php中携带的php-fpm和php-cgi的理解纠正
- JNI开发之捕获异常
- 香农外传
- 4.SpringMVC_@RequestParam和@RequestHeader 、@CookieValue 获取请求参数
- Android studio 命令行编译 Gradle 命令详解
- 用大白菜重装电脑系统
- 对php-fpm的理解重述
- 造成DELPHI程序的稳定性原因及解决方法
- Oracle之只有数据文件恢复数据库
- 游戏编程入门(15):开发 MeteorDefense(抵御流星)游戏
- Android MaterialDesign控件使用以及RecyclerView,ItemDecoration的基本使用
- iOS工作小结
- 第三章 C++与数据抽象
- Bootstrap3 导航条之个人学习笔记
- 人工智能全面战胜人类?下一步是取代人类?