laravel生产环境性能优化需预编译配置与路由、分库使用redis、规范缓存键前缀、合理配置队列worker参数及延迟加载模型。

上线前不调优,等于把性能瓶颈亲手装进生产环境。Laravel默认配置面向开发友好,但高并发、多查询场景下容易暴露I/O阻塞、重复编译、日志膨胀等问题。核心优化不在堆硬件,而在精准切换驱动、关闭调试钩子、规范缓存使用逻辑。
缓存与路由必须预编译
每次请求都解析全部配置和路由,是隐性性能杀手。文件驱动在高并发下极易成为磁盘IO瓶颈。
- 运行
php artisan config:cache,将所有config/和.env变量合并为单一PHP数组,跳过运行时解析 - 确认路由不含闭包(如
Route::get(..., function () {...})),再执行php artisan route:cache,生成bootstrap/cache/routes-v7.php - 视图缓存可选:
php artisan view:cache跳过Blade模板编译阶段,适合静态结构稳定的页面 - 每次修改配置或路由后,务必先
php artisan config:clear或route:clear,再重新缓存
Redis要分库用,别全挤在一个DB
共用redis DB=0会导致缓存、会话、队列互相干扰——比如FLUSHDB清空缓存时,用户Session也跟着失效。
- 在
.env中明确区分用途:REDIS_DB=0(默认连接)REDIS_CACHE_DB=1REDIS_QUEUE_DB=2REDIS_SESSION_DB=3 - 在
config/database.php的redis配置块里,为不同用途定义独立连接:
'cache' => [<br> 'host' => env('REDIS_HOST', '127.0.0.1'),<br> 'database' => env('REDIS_CACHE_DB', 1),<br>],<br>'queue' => [<br> 'host' => env('REDIS_HOST', '127.0.0.1'),<br> 'database' => env('REDIS_QUEUE_DB', 2),<br>],
- 对应在
.env中启用:CACHE_DRIVER=redisSESSION_DRIVER=redisQUEUE_CONNECTION=redis - 记得在
config/cache.php中把stores.redis.connection设为'cache',否则仍走default
缓存键命名必须带环境+业务前缀
没加前缀的user:123在测试/线上共用Redis时,会互相覆盖;多租户系统里还可能泄露数据。
- 统一在
.env中定义:CACHE_PREFIX=production:tenant_abc: - 在
config/cache.php的redis store配置中启用:'prefix' => env('CACHE_PREFIX', 'laravel_cache_') - 避免硬编码,封装辅助函数:
function cacheKey(string $type, int $id, string $tenant = null): string {<br> return env('CACHE_PREFIX') . "$type:$id" . ($tenant ? ":$tenant" : '');<br>} - 慎用
Cache::tags()——底层靠SCAN匹配前缀,数据量大时易阻塞;批量清理优先用redis-cli --scan --pattern "production:tenant_abc:user:*" | xargs redis-cli del
队列Worker要稳,不能只靠默认参数
默认queue:work长时间运行会内存泄漏,任务超时未处理还会堆积失败记录。
- 启动命令示例(含防护机制):
php artisan queue:work redis \<br> --queue=high,default,low \<br> --timeout=90 \<br> --tries=3 \<br> --max-jobs=300 \<br> --max-time=3600 \<br> --memory=128
-
retry_after必须大于最长单任务耗时(建议设为120秒),否则任务未执行完就被重放 - 在
config/queue.php中开启事务安全分发:'after_commit' => true,防止DB事务回滚但队列已发出 - 任务类中只传ID,不在
__construct()里加载模型;handle()中按需查库并限制关联加载,例如User::with('profile:id,user_id,bio')->find($this->userId)











