CGI,fast-cgi,PHP-FPM的工作原理和区别
CGI:
工作原理:用户请求->服务器->创建新的进程php-cgi->php脚本执行->服务器返回给用户端->销毁php-cgi进程
优点:简单,跨语言(任何语言都可以实现);进程隔离,安全;兼容性好
缺点:每个请求都会创建一个进程,开销大;并发高时,系统资源耗尽;无法共享数据库连接等资源;
fast-cgi:
Fast-cgi:是cgi的增强版本
工作原理:
fast-cgi进程池(进程池在内存中),进程池内有很多进程,比如进程1(处理A请求),进程2(空闲),进程3(处理B请求)
用户请求->服务器->通过socket(或TCP)与fastcgi进行通信->fastcgi进程池中空闲的进程处理请求->返回结果,进程等待下一个请求
优点:
进程服用,性能大幅度提升;支持持久连接;可以处理大量并发
缺点:
实现复杂,需要管理进程池;内存占用增加;配置复杂
一般情况下,FastCGI的整个工作流程是这样的:
1.Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
2.FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
3.当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4.FastCGI 子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时, 请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
l Php-fpm:
是fastcgi的一种协议体现,内置了进程管理,调度优化,状态监控等功能
Php-fpm进程管理方式及优缺点:
(1) 静态模式:
固定的worker进程数量,适合高负载且负载稳定的场景配置:
pm = static
pm.max_children = 50
工作原理:
进程数始终保持max_children个,不增加也不销毁
优点:
① 性能最稳定:进程数固定,无创建无销毁;响应时间可预测;适合高并发场景
② 无调度开销:不需要判断是否需要创建/销毁;CPU更稳定
③ 避免进程抖动:不会因为负载波动频繁的创建/销毁进程
缺点:
① 内存占用高:即使空闲也在占用内存;小内存服务器不适合。
② 配置要求精准:max_children如果设置过小,请求排队,响应慢。
③ 资源浪费:低峰期大量空闲进程占用内存浪费资源
(2) 动态模式(dynamic)-最常用:
根据负载动态调整进程数,适合负载波动大的场景。配置:
pm = dynamic
pm.max_children = 50 #最大进程数 注:核心参数决定最大并发
pm.start_servers = 10 #启动时进程数 注:设置过小启动时性能差
pm.min_spare_servers = 5 #最小空闲进程数 注:设置过小突发请求会卡顿
pm.max_spare_servers = 10 #最大空闲进程数 注:设置过大会浪费内存
pm.max_requests = 500 # 每个进程处理请求数后重启(防止内存泄露)
工作原理:
初始启动时创建10个(start_servers配置的)进程数
⬇
当负载上升时(空闲进程<最小空闲进程数(min_spare_servers)):创建新的进程数(直到max_children)。
⬇
当负载下降时(空闲进程>最大空闲进程数(max_spare_servers)):销毁多余空闲进程(直到最大空闲进程数)
⬇
始终保持最小空闲进程数
优点:
① 资源利用率高:根据负载调整;低峰期节省内存,高峰期支撑并发
② 灵活性好:应对突发流量能力强
③ 容错性好:max_request自动重启,防止内存泄露
缺点:
① 有一定调度开销:需要监控进程数;频繁创建/销毁进程有性能消耗
② 配置较为复杂:5个参数配置需要配合调整;参数设置不合理会影响性能
③ 响应时间有波动:创建进程需要时间。突发请求时首次响应可能比较慢
(3) 按需模式(ondemand):
空闲时进程数为0,有请求才创建。适合低负载,内存敏感的场景。配置:
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 10s #进程空闲最大时间(超过这个时间后销毁)
工作原理:
启动0个进程数,请求进来的时候没有空闲进程,立即创建一个进程,请求完成后进入进程空闲状态,空闲时间超过process_idle_timeout时销毁进程,最终回到0个进程数
优点:
① 内存占用极低:无进程时几乎为0;启动后根据需要创建进程数;适合小内存服务器(节省成本)
② 按资源分配:不会浪费资源;适合低频访问的应用
缺点:
① 首次请求慢:需要创建进程
② 突发流量性能差:比如100个请求同时到达需要创建100个进程,创建进程会消耗CPU和内存,可能会导致服务雪崩
③ 无空闲进程缓冲:无法应对瞬间流量;每个请求都可能触发进程创建
总结:
CGI每次都会启动新的进程;fast-cgi定义进程常驻进程池,请求复用的通信方式;php-fpm是fast-cgi的管理器,包含进程管理,配置优化,状态监控;
默认场景使用 dynamic(最通用);高并发场景选 static(性能优先);低负载场景选 ondemand(内存优先)。
注:max_children计算公式:(总内存-系统内存-其他服务内存)/单个进程内存
Php-fpm与nginx的通信:在nginx.conf里面配置:
#可以跨机器
fastcgi_pass 127.0.0.1:9000
fastcgi_index index.php
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;


浙公网安备 33010602011771号