商城首页欢迎来到中国正版软件门户

您的位置:首页 >nginx 如何解析php文件php-fpm的解释

nginx 如何解析php文件php-fpm的解释

  发布于2026-05-03 阅读(0)

扫一扫,手机访问

nginx 如何解析php文件php-fpm的解释

要理清这个过程,不妨先从nginx的配置入手。通常,我们会在nginx的配置文件(比如 /usr/local/nginx/conf/nginx.conf)里看到类似下面这样的段落:

location ~ \.php {
    root /nginx;
    fastcgi_pass 127.0.0.1:9000; // ip+port方式
    fastcgi_pass unix:/tmp/php-cgi.sock; // 【unix domain socket形式】这种是进程间通信,比tcp/ip要快
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    include /usr/local/etc/nginx/fastcgi.conf;
}

从这段配置不难看出,nginx正是通过 fastcgi_pass 指令,将动态请求“扔”给了后端的fastcgi处理器,也就是我们今天的主角——php-fpm。

那么,当web server(这里是nginx)收到一个类似 /index.php 的请求时,具体会发生什么呢?它会触发对应的CGI程序,也就是PHP解析器。接下来,PHP解析器会去读取并解析 php.ini 文件来初始化执行环境,然后处理具体的请求,最后按照CGI规定的格式将结果返回,并结束这个进程。最终,web server再将这个处理好的结果发回给用户的浏览器。

(顺带一提,关于php-fpm如何解析 php.ini 文件:新版本的PHP已经将php-fpm集成在内,不再是第三方扩展了,因此更推荐使用。安装时通过 ./configure --prefix=/usr/local/php --enable-fpm 参数开启支持即可。)

知识填充

要深入理解php-fpm,得先搞清楚几个基础概念。

CGI(通用网关接口),它的作用其实是充当一个“翻译官”,确保web server传递过来的数据是标准格式。不过,标准的CGI有个明显的短板:它每处理一个请求,都要重新解析一遍 php.ini 并初始化环境。这种“来一次,准备一次”的模式,效率自然高不起来。

于是,FastCGI 应运而生。你可以把它看作是CGI的“性能增强版”,一种开放的扩展协议。它的核心思路很聪明:不再为每个请求都启动一个新的解释器进程,而是让解释器进程常驻在内存中。这样一来,避免了重复的初始化开销,性能就得到了大幅提升。更重要的是,FastCGI是与平台和语言无关的,任何语言只要按照它的接口规范来实现,就能具备与web server通信的能力。

FastCGI的工作机制也很有意思。它会先启动一个master(主)进程,负责解析配置、初始化环境。然后,master进程会预先拉起多个worker(工作)进程并保持在内存中。当有请求到来时,master会迅速将其分配给一个空闲的worker来处理,自己则立刻准备接收下一个请求。这种“常驻进程+进程池”的模式,彻底避免了重复劳动。不仅如此,master进程还很“智能”,它会根据配置和负载情况动态管理worker进程的数量——请求多了就多启动几个候着,空闲久了就释放掉一些。这就在提升性能的同时,也做到了资源的合理利用。

所以,当HTTP服务器(如nginx)遇到一个动态请求时,流程就变成了:将请求转发给FastCGI进程管理器,由它指派一个worker进程执行PHP脚本,最后再将结果返回给HTTP服务器

-------------------- 以上提到的CGI和FastCGI,都是独立于具体编程语言的通用协议。

那么php-cgi又是什么呢?它其实就是PHP语言对CGI协议的具体实现,是PHP提供给web server的一个CGI协议接口程序。但php-cgi本身只是个“办事员”,它只会解析请求、返回结果,不具备进程管理的能力。因此,市场上就出现了一些能调度php-cgi进程的第三方管理器,比如从lighthttpd分离出来的spawn-fcgi。

php-fpm,正是官方提供的、功能更完善的解决方案。它全称是PHP FastCGI Process Manager,顾名思义,它是一个实现了FastCGI协议的程序,是PHP提供给web server的FastCGI协议接口。它的核心管理对象就是php-cgi进程。自从PHP内核集成了PHP-FPM之后,事情就变得简单多了,只需在编译时加上 --enable-fpm 参数就能使用。

1522886-20190619154201883-265416921.png

现在,让我们把整个链条串起来看:nginx接收到PHP文件请求 → 通过 fastcgi_pass 指令将请求发送给php-fpm → php-fpm作为php-cgi的进程管理器,通过其master-worker机制处理请求(这个过程完成了请求的规范化)→ 最终,仍由具体的php-cgi进程完成脚本解析和执行。

如果想了解Apache服务器是如何调用PHP的,可以移步参考:https://blog.csdn.net/u011280342/article/details/78121132

转载于:https://www.cnblogs.com/mxyindex/p/11051727.html

本文转载于:https://blog.csdn.net/weixin_30276935/article/details/97194779 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注