nginx + php-fpm的处理流程对比workerman、hyperf等

2023-06-01 00:00:00 nginx php

nginx是怎么通信的?

1.nginx 配置里 9000 端口是 php-fpm 程序默认端口,nginx 应该和 php-fpm 保持了长连接;如果没有,那每次请求连一次,太愚蠢了,nginx 监听了 80 端口,它内部有连接 9000 端口的套接字(对 php-fpm 来说,nginx 是客户端)


2.nginx 的主套接字监听 80 端口,有客户端完整请求时,它通过连接 9000 端口的套接字转发数据给 php-fpm


3.主套接字监听端口,是等别人来找你(服务端);连接其它软件的端口的套接字,是找别人(客户端)两个套接字,套接字也是文件资源句柄,一个守着 80 端口等用户发请求过来,一个把请求转发给 php-fpm 监听的 9000 端口


4.本机进程间通信,也叫 ip 换回连接,本机程序通信还有 unix ,就是监听 .sock 文件,数据传输在监听文件上表现,tcp 环回连接 性能不如 unix 连接


nginx处理客户端请求过程

nginx接收客户端数据,判断是否构成完整http消息

1.判断是否转交 php-fpm 处理

2.有选择地(请求行和部分消息头是专门给 nginx 看的,可能会剔除)将http消息发送给php-fpm 

3.php-fpm 主程序创建子进程

4.子进程将 http 消息更新超全局数组(也可能是主程序做),引入 php 入口文件,返回 http 响应给主程序

5.php-fpm 主程序将 http 响应消息返回给 nginx

6.nginx 将 http 响应消息返给客户端,并决定是否关闭连接(在响应头 Connection 字段通知客户端)



nginx+php-fpm、workerman区别

1.

php-fpm 创建子进程处理请求,一个子进程处理一个请求,处理完关闭子进程。

workerman/hyperf/ 其它 php 服务器,创建子进程,

但是子进程是独立的服务器,子进程接收客户端连接、数据、解出完整请求消息,转化为 request 对象,

经过应用程序得到 response 对象,再转成响应消息,最后发送给客户端。


2.

php 服务器没有 php-fpm 的来一个请求创建关闭一次子进程的消耗。

它的主程序只用来监听子进程服务器的运行与维护,发现子进程关闭后重新创建新的子进程。

它的子进程,就做了 nginx + php-fpm 的事,同时没有频繁的更下级的子进程的创建关闭消耗。


3.

nginx转发客户端请求给php-fpm主程序

php-fpm创建子进程处理请求

子进程引入 php 入口文件,通过业务逻辑将请求转成响应,返给主程序并关闭自身

php-fpm 主程序将子进程处理的响应返给nginx

nginx响应客户端。


4.

workerman 主程序创建 N(可配置)个各类

(tcp/http/udp/unix/https/websocket…) 子进程(相当于服务器)

其中,http 子进程完成类似 nginx + php-fpm 功能


workerman/nginx+php-fpm性能优势对比

1.不需要像 nginx 和 php-fpm 那样本地端口通信

2.不需要像 php-fpm 那样创建子进程专门处理

3.数据常驻内存,数据单例化高,性能越来越快,不需要单独重复性引入所谓入口文件及对应整套逻辑,http 子进程监听某个端口(比如 80),接收客户端连接、数据,处理后返回数据给客户端

相关文章