Laravel项目最简Hello World路由响应过慢是什么原因?
Laravel 无业务逻辑路由响应过慢排查方向
哪怕是无数据库操作、无复杂逻辑的最简路由,请求也会走完框架初始化、全局中间件、服务启动全流程,耗时高基本都是以下原因导致:
- 生产环境未开启框架缓存
Laravel在未开启缓存时,每次请求都会重新扫描所有路由文件、解析所有配置文件、加载所有视图编译逻辑,项目路由、配置文件越多,这部分耗时越高。生产环境必须执行以下命令生成缓存,能直接砍掉60%以上的框架初始化耗时:
注意缓存生成后,修改配置、路由需要重新执行对应命令才会生效,本地开发环境不建议开启缓存,避免修改代码不生效的问题。另外如果本地环境php artisan config:cache php artisan route:cache php artisan view:cacheAPP_DEBUG=true,框架会主动跳过缓存加载,本身就会比生产环境开缓存的状态慢,属于正常现象,但如果本地耗时超过200ms就属于异常。 - OPcache未开启
PHP默认每次请求都会重新解析、编译所有加载到的PHP脚本,Laravel单次请求会加载上千个框架文件,光脚本编译的耗时就能达到百毫秒级。生产环境必须开启OPcache扩展,配置合理的缓存参数,能再把框架基础耗时降低70%以上。 - 全局中间件存在阻塞逻辑
所有请求都会经过app/Http/Kernel.php中注册的全局中间件栈,和路由本身逻辑无关。常见的阻塞场景包括:全局中间件写入数据库日志、请求第三方接口拉取配置、解析IP地理位置、Session存储连接超时、遗留的调试sleep代码。
特别注意:哪怕路由本身没写业务逻辑,如果全局中间件里加载了Session、CSRF校验逻辑,框架会尝试连接配置的Session存储(Redis/数据库),如果存储服务连接异常(防火墙拦截、密码错误、服务未启动),会产生1s左右的连接超时,和描述里生产环境1200ms的耗时完全吻合。
可以通过php artisan route:list查看目标路由绑定的所有中间件,逐个注释排查耗时。 - 服务提供者冗余加载
所有注册在config/app.php的服务提供者,以及第三方包自动注入的服务提供者,都会在框架初始化阶段执行register和boot方法。不少第三方包会在boot阶段执行文件扫描、数据库查询、远程请求逻辑,哪怕当前路由根本没用到这个包的功能,也会被执行拖慢速度。可以在入口文件加断点打印各服务提供者的执行耗时,把非全局必需的服务提供者改成按需注册。 - 环境IO阻塞
本地环境如果把项目放在WSL2的/mnt/c跨系统挂载目录、共享文件夹、机械硬盘目录,会产生大量跨层IO开销,光类文件自动加载的耗时就能达到300-400ms,把项目移到系统本地磁盘、WSL2原生文件系统就能解决。
生产环境如果开启了xdebug等调试扩展且配置了远程调试地址、日志写入远程存储但网络不通,也会产生百毫秒到秒级的阻塞,生产环境必须卸载所有调试类扩展。
排查时可以先在public/index.php入口文件打印初始时间戳,再在路由回调最开始打印时间戳,两个时间的差值就是框架初始化阶段的耗时,如果差值和总耗时接近,就可以确定问题出在框架启动流程,不需要排查业务逻辑。
内容的提问来源于stack exchange,提问作者Eric Efrain Almendras Arnez
相关产品推荐
相关产品推荐

