cgi进程设置多少 宝塔_php与swoole进程模型知多少

c9beb83e183e102b55965093a99fc88a.gif
面试中,我们经常会被问到,PHP是怎么运行的,swoole为什么比nginx和php-fpm的组合效率高等等进程模式方向的内容。平时倒是多多少少有听过sapi,php-fpm,Master/Worker,但要是真回答起来,就开始模棱两可甚至概念都会有点模糊。因此特地整理总结了一下,也为大家理清一下思路。

Apache和LoadModule模式

Apache和LoadModule模式运行PHP应该是属于比较经典的了,小马初识PHP就是用的这个模式。是否还记得我们安装完apache和PHP后在 Apache的配置文件 httpd.conf中加上这样的配置:

# 加入以下2句LoadModule php5_module E:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下内容<IfModule dir_module>DirectoryIndex index.php index.html</IfModule>

所以,这种方式本质是用 LoadModule 来加载 php5_module,把php作为apache的一个子模块来运行。当通过web访问php文件时,apache就会调用php5_module来解析php代码。php5_module通过sapi将数据传给php解析器来解析php代码。如图。

b8cba54983d3067267643ed0178833e7.png

图片资源来源于网络

apache调用php执行的过程如下:apache -> httpd -> php5_module(sapi) -> php

sapi(server api)其实就是一种协议,sapi提供了一个和外部通信的接口,使得PHP可以和其他应用(apache,nginx等)进行交互数据。

常见的有如PHP提供给apache和nginx的php5_module、CGI、FastCGI,提供给IIS的ISAPI(记得小马曾经在.net团队中配置过IIS跑PHP),提供给Shell的CLI等协议。

Apache也有三种工作模式

66bd88c6481b4665be5a3e82fe03a466.png

图片资源来源于网络

Apache进程模型

364fca4a0c7f26c907facc810607e4b4.png

图片资源来源于网络

每一个请求到达,apache都会去fork一个子进程来连接php通过sapi来处理请求,直到这个请求处理完毕,且apache处理请求是同步阻塞方式。一个客户端占用一个进程,所以进程的数量决定了并发处理的能力,对高并发并不是很友好。

Nginx和php-fpm组合

Nginx和php-fpm的组合是 Master主进程/Worker多进程模式,启动一个 Master 进程通过 FastCGI 协议监听来自 Nginx 传输的请求,再fork 多个Worker进程处理请求,但每个Worker进程只对应一个请求连接,用于执行完整的PHP代码。

对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重新初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。

1824cfb4a46cd8b7f3356538fc6820a8.png

图片资源来源于网络

总结一下:进程模型apache与nginx两者的主要区别在于apache是同步多进程模型,一个连接对应一个进程;而nginx是异步的,多个连接可以对应一个进程(一个Master多个Worker)。(题外话:不过apache的rewrite比Nginx的rewrite强大。)

4b566f36bac6570ca00dff4416753bc7.png

运行模式的“进化”

所以,PHP WEB服务器目前最佳方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)不建议 Module加载或者CGI方式。

swoole进程模型

swoole是怎么做到那么优秀的呢?为什么就重新定义了PHP而使其能号称全宇宙最好的语言呢?我们看一下进程模型。

swoole也是Master主进程(由多个 Reactor 线程组成)和Worker多进程(或多线程)模式,不同的是,包含了Reactor 线程和Manager 进程的概念。

64f925f747a60b49ffcec63e59bebfd6.png

swoole进程模型

启动一个Master进程,初始化PHP代码(仅在启动时执行一次初始化),因为 swoole 需要通过cli的方式运行,所以初始化时,不会初始化 PHP 的全局变量,如 $_SERVER, $_POST, $_GET 等;执行 PHP 脚本,包括词法、语法分析,变量、函数、类的初始化等,由Reactor线程监听 Socket 句柄的事件变化(Master进入监听状态,但并不会结束进程),Reactor线程负责子多线程的均衡问题,Manager 进程管理Worker多进程,包括 TaskWorker 的进程。每一个Worker进程接收来自Reactor的请求,只需要执行回调函数部分的PHP代码。

70924341c5675ad1e4d3fcb2396e2304.png

swoole进程

255feb62b52155bcaac2028020365871.png

swoole运行流程图

那么这个进程模式为什么能对性能加速呢?为什么能比传统的PHP运行模式高效呢?因为由Reactor线程(epoll的IO复用方式)负责监听Socket句柄的事件变化,负责子进程均衡问题,减少高并发下的资源开销。通过内存常驻的方式节省php代码初始化的时间。小马认为,其实主要还是协程的使用。

好了,整理就到这了,应该是比较清晰了。

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里PHP进阶架构师>>>实战视频、大厂面试文档免费获取

原文链接:https://baijiahao.baidu.com/s?id=1667630299393187658&wfr=spider&for=pc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值