本文目录导读:

- 启用 OpCache(最核心、最有效)
- 减少自动加载(Autoloading)的 I/O 开销
- 配置、路由与服务提供者缓存
- 使用 JIT 编译器(PHP 8.0+)
- 精简服务提供者与中间件
- 使用 PHP-FPM 的进程数管理(减少冷启动)
- 文件系统优化
- 数据库连接池(减少连接建立时间)
- 不同场景的优化优先级
优化 PHP 项目的启动速度,通常指减少从接收到请求到框架/应用完成初始化并开始处理业务逻辑之间的时间(即冷启动或请求启动的延迟),这在现代高并发、容器化(Docker)以及 Serverless(函数计算)环境中尤为重要。
以下是经过验证的、从系统到代码层面的优化策略,按影响程度从高到低排列:
启用 OpCache(最核心、最有效)
PHP 是解释型语言,每次请求都需要将 .php 文件编译成 Opcode(操作码),OPcache 会缓存编译后的 Opcode,避免重复编译。
关键配置:
; 启用 opcache.enable=1 ; 内存大小(根据项目大小调整,推荐 128M-512M) opcache.memory_consumption=256 ; 最大缓存文件数 opcache.max_accelerated_files=20000 ; 检查文件时间戳的频率(生产环境设为 0,减少 stat 调用) opcache.validate_timestamps=0 ; 如果实在需要自动更新,设置检查间隔 ; opcache.revalidate_freq=60 ; 进阶优化(减少重启时的内存浪费) opcache.fast_shutdown=1 opcache.interned_strings_buffer=16
注意:validate_timestamps=0 时,修改文件后需要重启 PHP-FPM 或调用 opcache_reset() 才能生效。
减少自动加载(Autoloading)的 I/O 开销
Composer 的自动加载是启动时的主要开销来源。
-
生成优化过的自动加载器:
composer dump-autoload -o
这会生成 Classmap(类映射),将类的路径直接硬编码到数组中,避免了扫描目录寻找文件的操作,对于大型项目,效果非常明显。
-
使用权威类映射:
composer dump-autoload -a
这告诉自动加载器“只从 Classmap 加载”,如果某个类不在 Classmap 中,直接报错,这省去了回退到 PSR-0/4 的查找逻辑。
-
按需加载 Facades(Laravel): 在 Laravel 中,可以运行
php artisan optimize来合并配置、路由、服务提供者等,减少每个请求的文件读取和解析。
配置、路由与服务提供者缓存
现代框架(Laravel、Symfony、ThinkPHP)在启动时都需要读取和解析大量配置文件、路由定义。
-
Laravel (5.5+):
# 缓存配置(所有配置合并为一个文件) php artisan config:cache # 缓存路由(路由列表序列化) php artisan route:cache # 缓存事件和监听器 php artisan event:cache
-
Symfony:
# 生成缓存预热 php bin/console cache:warmup
-
ThinkPHP 6:
# 生成配置缓存 php think optimize:config php think optimize:route
使用 JIT 编译器(PHP 8.0+)
JIT(Just-In-Time)将热点代码编译为机器码,虽然主要提升计算密集型任务的性能,但也能减少解释执行的开销。
; php.ini 配置 opcache.jit=1235 ; 默认开启,建议使用 tracing 模式 opcache.jit_buffer_size=256M
对于纯 Web 项目(I/O 密集型),JIT 提升不明显,但对于计算复杂的启动引导流程(如复杂的 DI 容器解析),有一定帮助。
精简服务提供者与中间件
- 禁用不必要的服务:检查
config/app.php(Laravel)或 Services 列表,移除你根本没用到的第三方包(如 Horizon、Telescope、Debugbar 等)。 - 懒加载(Lazy Loading):确保服务提供者不是必须注册的,Laravel 支持延迟加载服务提供者(
$defer = true)。 - 减少中间件:每个中间件都增加一层请求处理,只保留全局必需的中间件。
使用 PHP-FPM 的进程数管理(减少冷启动)
pm.start_servers 配置决定了最小空闲进程数,如果进程被回收后等待新请求,会触发冷启动。
-
pm = dynamic: 设置较高的pm.min_spare_servers和pm.start_servers,确保始终有空闲进程,但要注意内存占用。 -
pm = ondemand(适合内存极小的环境,如 Docker): 按需启动,但第一个请求会有明显延迟,如果使用ondemand,务必配合 OpCache 和自动加载优化。
文件系统优化
- 使用 NFS 或远程存储?这会是瓶颈,PHP 项目启动时大量加载文件,如果文件存放在 NFS 或 S3 挂载的磁盘上,IO 延迟会拖垮速度。
- 最佳实践:在容器或服务器本地挂载项目文件。
- 符号链接(Symlinks):过多的符号链接会增加
realpath()调用的开销,在 PHP 7.0+ 中,realpath_cache_size可以对realpath进行缓存:realpath_cache_size=4096K realpath_cache_ttl=600
数据库连接池(减少连接建立时间)
PHP 本身不支持连接池(每个请求独立生命周期),但可以通过 Swoole 或 RoadRunner 实现常驻内存运行,彻底消除启动开销,这是终极方案。
- Swoole:将 PHP 应用变为常驻服务,所有类、配置、连接都在内存中,启动速度降低到 1ms 级别。
- RoadRunner:Go 语言编写的 PHP 应用服务器,同样支持进程常驻。
不同场景的优化优先级
| 场景 | 第一优先级 | 第二优先级 | 第三优先级 |
|---|---|---|---|
| 传统共享主机 | OpCache + composer dump-autoload -o |
禁用不用的扩展 | 精简代码 |
| Docker 容器(生产) | OpCache + JIT + composer dump-autoload -a |
框架缓存 (config/route) | 调整 PM 进程数 |
| 高并发 API | 框架缓存 + OpCache + 精简服务提供者 | 考虑迁移到 Swoole/RoadRunner | 减少中间件 |
| Serverless (Lambda) | 预热 + 极小的镜像 + 使用 PSR-7 轻量框架 (如 Slim) | 禁用所有非必需扩展 | 最小化依赖 |
一个简单的实践步骤:
- 先检查 OpCache 是否启用(运行
php -i | grep opcache.enable),这是零成本的优化。 - 运行
composer dump-autoload -o。 - 如果是 Laravel/Symfony,执行
php artisan optimize。 - 配置
realpath_cache。 - 最后再考虑 JIT 或升级 PHP 版本(PHP 8.x 比 7.x 启动速度快约 20-30%)。