1

接管php-fpm运行方式

 2 years ago
source link: http://ukagaka.github.io/php/2020/10/20/fastCGI.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最近新入职了一家游戏公司,公司不在采用常用的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”) 的区别


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK