[思考]由Nginx配置fastcgi引导出的php-fpm的问题
[思考]由Nginx配置fastcgi引导出的php-fpm的问题
1、CGI是什么?
CGI协议:它的协议定义文档是:http://www.ietf.org/rfc/rfc3875。
CGI(Common Gateway Interface)是能让web服务器和CGI脚本共同处理客户的请求的**协议【但不是网络协议的】**。这个协议可以用vb,c,php,python 来实现。cgi只是接口协议,根本不是什么语言。
其中Web服务器负责管理连接,数据传输,网络交互等。至于CGI脚本就负责管理具体的业务逻辑。Web服务器的功能是将客户端请求(HTTP Request)转换成CGI脚本请求,然后执行脚本,接着将CGI脚本回复转换为客户端的回复(HTTP Response)。
CGI的脚本请求有两部分:请求元数据(request meta-variables)和相关的消息体(message-body)。
* CGI / FastCGI 本质是「接口规范(Interface)」而不是网络协议。但它们**定义了通信格式和交互方式,所以很多人也习惯称其为“协议”
- CGI / FastCGI 不关心 TCP / UDP
- 它关心的是:Web Server 如何启动/连接应用、环境变量怎么传
典型CGI相关
- CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
- FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。
- PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。PHP-FPM实现了FastcGl这个标准
- ==【目前的主流】==PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
PHP-FPM(FastCGI Process Manager)实际上是一个守护进程,它会在后台运行,并监听来自 Web 服务器(如 Nginx 或 Apache)的 FastCGI 请求。PHP-FPM启动后包含master进程和worker进程两种进程(master / worker 架构)。master进程只有一个,负责监听端口,接收Nginx的请求。而worker进程则一般有多个(可配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
当Nginx接收到相关HTTP 请求后,会将处理 PHP 脚本的请求转发给 PHP-FPM,后者再将任务分配给自己的工作进程来执行 PHP 代码。
简单来说,PHP-FPM 既是一个守护进程,也是一个监听程序,它通过监听指定的端口或 Unix 套接字来接收并处理请求。
PHP-CGI和Nginx配置的1个bug,鸟哥报过:https://www.laruence.com/2010/05/20/1495.html
当时是2010年,那时候php-fpm还没成主流
- php-fpm.conf配置文件用于控制PHP-FPM管理进程的相关参数,比如工作子进程的数量、运行权限、监听端口、慢请求等等。我们在编译安装PHP的时,在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。
Browser
↓ HTTP
Nginx
↓ FastCGI
PHP-FPM (master)
↓
PHP-FPM (worker process) 内部都嵌入了一个PHP解释器
↓
execute PHP附录2.何时需要重启PHP-FPM服务?
结论:
1、一般部署新的php代码不用,新的代码会在下一次请求时自动加载生效。【OPCache缓存刷新需求除外】
- OPcache 缓存:
- 如果启用了 OPcache,默认配置下会自动检测文件变化(通过
opcache.validate_timestamps和opcache.revalidate_freq参数)。- 如果配置为自动检测,那么改动后经过短暂延时(通常是几秒钟)就会生效。
- 如果关闭了文件检测,则需要重启 PHP-FPM 或手动清除缓存。
- 如果启用了 OPcache,默认配置下会自动检测文件变化(通过
2、如果改数据库之类的conf配置文件的时候,需要看查找数据库配置的加载机制,特别是要在PHP代码中寻找配置文件加载的相关代码
3、修改了PHP-FPM配置文件【必须重启】典型的
- php/etc/php-fpm.conf
- php/etc/php-fpm.d/www.conf
- webserver/conf/php-fpm.conf
- 修改了PHP-FPM配置文件后
- 修改了PHP.ini配置文件后
- 添加或更新了PHP扩展后【就类似go mod导了新的包】
- 当PHP-FPM进程出现异常或内存泄漏时【很显然吧】