PHP预加载指PHP-FPM启动时将指定类/脚本编译并常驻OPcache共享内存,后续请求直接执行字节码,跳过文件I/O、解析与编译全过程;需PHP≥7.4、opcache.enable=1、显式配置绝对路径的opcache.preload,并重启服务生效。

Apache 本身不“预加载 PHP 模块”来加速执行——模块是加载一次、长期驻留的,关键在于让 PHP 代码本身更快启动和运行。所谓“预加载”,实际指的是在 Apache 启动时就将 PHP 解释器(或其核心字节码)常驻内存,避免每次请求都重新解析、编译脚本。这主要靠 OPcache 和 PHP-FPM 的进程管理机制 实现,而非 Apache 模块本身的“预加载”功能。
启用 OPcache 缓存字节码
这是最直接、最有效的“预加载”效果:PHP 脚本首次执行后,OPcache 会把编译好的字节码存进共享内存,后续请求直接复用,跳过解析与编译阶段。
- 确认已启用:编辑 php.ini,确保以下配置存在且未被注释:
opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1
- 重启 Apache(或 PHP-FPM 服务)使配置生效
- 创建
info.php文件并访问,检查 phpinfo() 输出中是否显示 “Zend OPcache” 已启用且状态为 enabled
使用 PHP-FPM 替代 mod_php(推荐方式)
mod_php 把 PHP 嵌入 Apache 进程,虽启动快但内存占用高、版本切换难;而 PHP-FPM 是独立的 PHP 进程管理器,支持真正的“常驻+预启动”:
- PHP-FPM 启动时即 fork 出固定数量的子进程(
pm.start_servers),这些进程始终待命,无需为每个请求新建 - 配合 OPcache,每个 FPM 子进程都自带字节码缓存,实现“进程级预热”
- Apache 通过
mod_proxy_fcgi将 .php 请求转发过去,解耦稳定、资源隔离、支持多版本共存
避免伪“预加载”误区
有些资料提到“Apache 加载 DLL 就算预加载”,这是误解:
立即学习“PHP免费学习笔记(深入)”;
-
LoadModule php_module ...只是让 Apache 知道有这个扩展可用,并不执行任何 PHP 代码 -
AddType或AddHandler只是路由规则,不涉及执行优化 - 真正影响响应速度的是 PHP 层的字节码缓存(OPcache)、进程复用(FPM)和底层扩展(如 redis、pdo_mysql)是否就绪
可选:PHP 8.1+ 的原生 Preload 功能
若使用 PHP 8.1 或更高版本,可在 php.ini 中指定一个 preload 脚本,让 PHP 在启动时就加载并编译常用类库:
- 新建
/path/to/preload.php,用spl_autoload_register()或require_once引入核心类文件 - 在 php.ini 中添加:
opcache.preload=/path/to/preload.php - 注意:该脚本必须在 OPcache 启用前提下才生效,且所有被 preload 的类将全局共享,不可动态重载



















