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;

 

posted @ 2021-03-10 14:34  阿陌i  阅读(302)  评论(0)    收藏  举报