Apache/Nginx如何将请求数据传递给PHP解释器?
Apache(或其他Web服务器)如何将请求数据传递给PHP解释器?
Web服务器和PHP解释器之间的通信主要依赖两种主流模式,核心都是通过环境变量和请求体数据流传递请求数据,PHP正是基于这些数据生成$_GET、$_POST、$_SERVER等超全局变量:
1. 传统CGI模式
- Apache定位到目标
.php文件后,会启动一个独立的php-cgi进程。 - 它会把请求的元数据(比如请求方法
REQUEST_METHOD、请求地址REQUEST_URI、请求头信息等)以环境变量的形式传递给这个进程。 - 如果是POST、PUT这类带请求体的请求,Apache会把请求体的内容通过**标准输入(stdin)**传递给
php-cgi。 - PHP解释器读取这些环境变量和标准输入,解析后填充对应的超全局变量,执行脚本后再把输出通过**标准输出(stdout)**返回给Apache,最后由Apache把结果转发给客户端。
- 这种模式的缺点是每次请求都要新建进程,性能开销较大,现在已经很少用。
2. 主流FastCGI/PHP-FPM模式
- 这是目前生产环境的主流方案:PHP-FPM(FastCGI Process Manager)会预先启动一批常驻的PHP进程,形成进程池,不需要每次请求都新建进程。
- Apache通过FastCGI协议和PHP-FPM进程池建立通信,同样把请求元数据通过环境变量传递,请求体数据则通过FastCGI协议的专用通道(本质还是类似标准输入的字节流)传递给PHP进程。
- PHP进程接收数据后解析生成超全局变量,执行脚本完成后,把输出通过FastCGI协议返回给Apache,再由Apache响应给客户端。
其他Web服务器(比如Nginx)的逻辑和Apache基本一致,都是通过CGI或FastCGI协议传递环境变量和请求体数据,PHP解释器基于这些数据构建开发者常用的超全局变量集合。
内容的提问来源于stack exchange,提问作者jpegoraro
相关产品推荐
相关产品推荐

