接管php-fpm运行方式

2020/10/20

最近新入职了一家游戏公司,公司不在采用常用的LNMP的环境进行开发,而是去掉了nginx,通过代理链接fast CGI进行进行发送请求。也让我恶补了一下php的运行模式

1、先介绍下PHP的运行模式。

    1、CGI(通用网关接口 / Common Gateway Interface)
    2、FastCGI(常驻型 CGI / Long-Live CGI)
    3、CLI(命令行运行 / Command Line Interface)
    4、LoadModule【Apache 独有】
    5、ISAPI(Internet Server Application Program Interface)【IIS 独有】

CGI 还有 ISAPI模式已经被弃用,这里不再介绍,想要了解的可以参加下面的参考链接查看

LoadModule属于 Apache 独有的模式,因为现在 nginx 轻量级和出色的并发性的优点,Apache份额越来越少,也不多做介绍了。

CLI是一种命令行的执行方式,如果经常写PHP脚本就会对它有些了解,我们经常使用 Linux 的定时任务 Crontab 进行定时执行脚本。包括现在php5.4开始,内置的web服务器,启动方式就是使用的CLI形式。 使用php -S localhost:8000 启动的本地web服务,也是使用CLI的模式,

FashCGI 属于 CGI 的升级版,主要作用是处理。通过解耦,功能单一的原则。

注意,FashCGI走的 php.ini 和 CLI 走的 php.ini 不是一个配置,所以一定要特别注意

2、 请求流程

前端发起请求 ————> web服务器nginx收到请求以后 ————> 检测到是PHP的请求,TCP的形式转发给 ————> PHP-fpm 启动的 master进程 ————> master进程会去检测创建的空闲 fastCGI 子进程,如果没有空闲的,则master进入队列等待有空闲的在处理)————> 子进程载入配置文件(php.ini)————> 处理请求 ————> 然后返回资源给master ————> fastCGI进程挂起,空闲 ————> master将结果返回给web服务器nginx ————> nginx在返回给用户。 

不管是用nginx转发请求给php-fpm,还是官网提供的内置web服务器,都是可以把php请求给php-fpm,所以,我们公司相当于用其他程序监听了php-fpm的master进程,然后把一些请求直接给到 fastCGI程序。这样PHP就接收到请求了。

3、接收请求

虽然能接收到请求,但是会发现,在平常使用PHP的内置函数 $_POST 接收参数时,接收不到参数。查看官方文档,这样介绍的。

    当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本。

因为通过接管程序,请求时不在HTTP协议内指定 Content-type,所以使用 $_POST 并不能获取到请求参数,需要使用另外一种方式 file_get_contents('php://input') 方式来获取请求的参数。

原文链接:Dennis`s blog

参考链接:
认识PHP运行模式
PHP 进程管理器 PHP-fpm 配置说明
一文搞懂 $_POST 和 file_get_contents (“PHP://input”) 的区别

Post Directory