Composer 项目可通过生成纯类定义的预加载脚本并配置 opcache.preload 实现高效预加载;需用 composer-preload 工具扫描指定目录生成 preload.php,再在 php.ini 中启用 opcache 并指定路径,注意仅预加载稳定类、部署时重新生成脚本。

Composer 本身不直接支持 PHP 预加载,但可以通过合理组织自动加载逻辑、生成预加载脚本,并配合 PHP 7.4+ 的 opcache.preload 配置,实现 Composer 项目的高效预加载。
理解 PHP 预加载的核心限制
PHP 预加载在 Web 请求前一次性载入指定 PHP 文件到 OPCache 内存中,所有请求共享。但它不能动态执行 autoload 逻辑,也不支持 Composer 的自动加载器(如 vendor/autoload.php)直接被 preload —— 因为该文件会注册闭包、修改全局状态,而预加载阶段禁止副作用操作。
因此,关键不是“让 Composer 自动加载器被预加载”,而是提取出真正需要常驻内存的类文件路径,显式写入预加载脚本。
生成适合预加载的类列表
推荐使用社区工具 composer-preload(由 ocramius 维护)自动生成预加载清单:
立即学习“PHP免费学习笔记(深入)”;
- 安装:
composer require --dev ocramius/composer-preload - 配置
composer.json中的"preload": { "include": ["src/", "lib/"] }指定需预加载的目录 - 运行:
./vendor/bin/preload,它会扫描指定路径下所有.php文件,输出一个包含require_once的预加载脚本(如var/preload.php)
该脚本只包含纯类定义文件,不含任何运行时逻辑,符合预加载安全要求。
配置 PHP 启用预加载
编辑 php.ini(注意:是 CLI 和 FPM 共用的配置,若用 FPM 需改 www.conf 对应的 php_admin_value[opcache.preload]):
opcache.enable=1opcache.preload=/path/to/var/preload.php-
opcache.preload_user=www-data(确保 PHP 进程有权限读取该文件) - 重启 PHP-FPM 或 Web 服务器使配置生效
可通过 opcache_get_status()['preload_statistics'] 验证是否加载成功及命中情况。
注意事项与优化建议
预加载不是“开箱即用”的银弹,需结合项目特点调整:
- 仅预加载高频使用、稳定不变的类(如框架核心、实体、DTO),避免把测试类、命令行工具类等一并加载
- Composer 的
classmap生成模式(composer dump-autoload -o)可提升自动加载性能,但对预加载无直接影响;预加载后,这些类已常驻内存,自动加载器几乎不再触发 - 部署时务必重新生成预加载脚本(如 CI/CD 流程中加入
./vendor/bin/preload),否则代码变更不会生效 - 预加载脚本中不要
require任何依赖外部状态的文件(如配置、环境变量),否则会导致预加载失败











