流程图(文字版)
浏览器请求 index.php
│
▼
Web服务器(Apache/Nginx)
│ 判断请求类型
├─ 静态文件 → 直接返回
└─ PHP 文件 → 通过 FastCGI 发送请求
▼
PHP-FPM 进程池
│ 空闲进程接收请求
▼
PHP 解析器执行脚本
│
├─ 解析 PHP 代码
├─ 执行业务逻辑
└─ 输出 HTML/JSON
▼
返回给 Web 服务器
▼
Web服务器发送响应
▼
浏览器显示页面
流程解释
1、请求到达服务器
浏览器访问 PHP 页面,例如:http://example.com/index.php。
请求首先到达 Web 服务器 Apache 或 Nginx(负责接收 HTTP 请求)
2、判断请求类型(静态文件 vs PHP 脚本)
- 如果是静态文件(HTML、JS、CSS、图片) → 直接返回给客户端
- 如果是 PHP 文件 → 转发给 PHP 解析器
配置方式:
| Web服务器 | PHP 解析方式 |
|---|---|
| Apache + mod_php | Apache 内嵌 PHP 模块直接执行 |
| Apache/Nginx + PHP-FPM | Web服务器通过 FastCGI 协议把请求发给 PHP-FPM |
3、请求传递给 PHP-FPM(如果使用 PHP-FPM)
3.1. Web服务器生成 FastCGI 请求
包含信息:
- 文件路径(SCRIPT_FILENAME)
- 请求方法(GET/POST)
- Query 参数(QUERY_STRING)
- HTTP 头信息
3.2. 请求发送到 PHP-FPM 进程池
PHP-FPM 有多个进程等待处理请求
空闲进程拿到请求,开始执行 PHP 文件
4、PHP 文件解析执行
PHP-FPM 调用 PHP 解析器(Zend Engine) 执行脚本:
- Lexer/Parser → 把 PHP 代码解析成抽象语法树(AST)
- Opcode 编译 → 编译成 Zend VM 的字节码
- 执行 → 执行字节码,生成输出(HTML、JSON 等)
- 处理输出缓冲 → PHP 可以使用 ob_start() 缓存输出,最后统一发送
同时:
- PHP 可以访问数据库(MySQL/PostgreSQL)、缓存(Redis)、文件等
- 可以执行业务逻辑、模板渲染(Smarty、Twig 等)
5、返回响应
- PHP 执行完毕 → 输出内容(HTML/JSON/图片等)
- PHP-FPM 把输出通过 FastCGI 协议返回给 Web 服务器
- Web服务器(Apache/Nginx)接收到内容 → 添加 HTTP 响应头 → 返回给客户端浏览器
浏览器收到响应 → 渲染显示页面