php 7.4预加载通过将类文件在服务器启动时编译并常驻内存,彻底跳过每次请求的open/stat/read及语法解析、opcode编译等io与cpu操作,显著降低高并发下的延迟。

PHP 7.4 的预加载(Preloading)能减少 IO,核心在于把原本每次请求都要做的磁盘读取、语法解析、编译成 opcode 的过程,提前挪到服务器启动阶段一次性完成,并常驻内存。
它不是简单“缓存文件”,而是跳过了整个 PHP 请求生命周期中代价最高的几个 IO 环节:
预加载直接规避的 IO 操作
-
不再每次 require/include 时打开文件:普通自动加载(如 Composer Autoloader)每遇到一个新类,就要调用
open()系统调用去磁盘找.php文件;预加载后,类定义已在内存,连stat()检查文件是否存在都省了。 - 跳过文件内容读取(read()):无需从磁盘或 SSD 把源码字节流读进 PHP 进程内存。
- 免去重复解析与编译:PHP 解释器不用再对同一份源码反复做词法分析、语法分析、生成 opcode —— 这些在预加载时已做完,且链接好类继承、接口实现、trait 引入等依赖关系。
对比:没预加载 vs 有预加载
| 环节 | 普通请求(无预加载) | 预加载启用后 |
|---|---|---|
| 类文件定位与打开 | openat(AT_FDCWD, "app/Http/Controllers/UserController.php", ...) |
完全不触发 |
| 读取源码内容 | read(3, "<?php class UserController { ...", ...) |
不触发 |
| 编译为 opcode | PHP 解释器执行完整编译流程(耗 CPU + 内存) | 已编译好,直接复用 |
类符号链接(如 extends Model) |
运行时动态解析父类是否已加载 | 启动时已完成拓扑排序与链接 |
补充说明:为什么这特别省 IO?
- 磁盘 IO(尤其是机械盘或高负载 SSD)延迟通常在 0.1–10ms 量级,而一次典型 Web 请求中可能加载 50–200 个类 —— 光文件打开+读取就可能累积几十毫秒。
- 即使使用 OPcache,它仍需在每个请求首次访问时检查文件修改时间(
stat())、验证缓存有效性,再从共享内存加载 opcode;预加载则彻底绕过这些运行时判断。 -
opcache_compile_file()在 preload.php 中调用,只编译不执行,不触发任何 IO 或副作用,纯粹是“把代码结构固化进内存”。
所以,预加载减 IO 的本质是:用一次性的、可预测的启动开销,置换掉成百上千次不可控的、分散在每个请求中的随机磁盘访问。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











