根本原因是运行环境、配置策略和执行路径不同:开发用artisan serve单进程无优化,生产需Nginx+PHP-FPM;OPcache未启用、缓存未预编译(config:cache/route:cache)、数据库N+1查询与索引缺失、日志I/O阻塞及中间件冗余执行被放大。

PHP 运行模式与底层处理不同
开发环境通常用 php artisan serve 启动内置服务器,它是单进程、阻塞式、无优化的简易 HTTP 服务,不经过 Nginx 或 Apache,也不走 PHP-FPM。它适合调试,但完全不模拟真实生产链路。
生产环境必须使用 Nginx + PHP-FPM 组合:
- FPM 进程池配置不合理(如
pm.max_children过小)会导致请求排队等待 - Nginx 未启用静态资源缓存、gzip 压缩或 fastcgi 缓存,大量 .js/.css 请求直击 PHP
- PHP 未开启 OPcache,每次请求都重新编译脚本,CPU 负载飙升
缓存机制默认关闭或配置错位
开发环境常设 APP_DEBUG=true,Laravel 自动禁用多数缓存(如配置、路由、视图),所有文件实时重读;而生产环境若没手动启用,这些缓存就一直闲置。
常见疏漏:
- 没运行
php artisan config:cache,每次请求都要加载十几个 .php 配置文件 - 没运行
php artisan route:cache,路由匹配靠动态解析,而非预编译数组查找 - 缓存驱动配成
file或array,看似能用,实则 I/O 更重、不跨进程、无法共享
数据库与 I/O 行为被放大
开发时数据量小、查询少、网络延迟低,掩盖了低效操作;生产环境下这些问题会被指数级放大:
- N+1 查询在本地查 10 条用户可能毫秒级,线上查 1000 条用户+关联 profile,变成上千次 DB 往返
- 未加索引的 WHERE 条件,在百万级订单表里从 20ms 慢到 2s+,且拖慢整个连接池
- 日志写入设为
daily或single,高并发下磁盘 I/O 成瓶颈;而开发常用stack或errorlog,影响小
中间件与请求栈实际更重
开发中容易忽略中间件的实际开销。比如:
- 全局注册了
VerifyCsrfToken,但 API 路由误套在web中间件组,每次请求都做 session 初始化+token 校验 - 自定义鉴权中间件反复查 Redis 或调用远程服务,未加本地缓存或失败降级
- Debugbar、Telescope 等开发工具未彻底关闭,仍注册收集器,悄悄拖慢每个请求


















