有条理地发现 N+1 问题
下面介绍用 Telescope 排查 N+1 的实战流程。不是简单地“注意到同样的 SELECT 反复出现”,而是把修复后的确认也串成一条完整的工作流。1
在 Requests 中找出慢请求
打开
/telescope,在 Requests 标签中锁定执行时间较长的请求。2
在 Queries 中查看发生的 SQL
打开请求详情,会显示该请求期间执行的所有 SQL。如果看到形状相同的 SELECT 反复出现,那就是 N+1。
3
加上 Eager Loading 修复
在代码里加
with(),再次确认查询。查询数量大幅减少就说明修复完成。dd() 或日志,这一整套流程都能在浏览器里完成。
用标签追踪特定请求
Telescope 有标签功能。用Telescope::tag() 给条目打上任意标签,再在面板的过滤器里就能快速筛出带该标签的条目。
在只想追踪特定用户 ID、订单 ID 相关的处理时非常有效。
/telescope/requests 页面的 Search 里输入 user:42,就能只看用户 ID=42 的请求。
自动给模型打标签
在TelescopeServiceProvider 的 tags 方法中,可以给所有条目附加特定模型的 ID 标签。
HasTags 契约,该模型被记录时会自动带上标签。
用好 Dump watcher
用dump() 时输出可能混进 HTML 响应,导致 API 调试变得困难。Telescope 的 Dump watcher 可以把 dump() 的输出从浏览器响应里剥离,记录到面板里。
用法很简单:在 /telescope 的 “Dump” 标签保持打开,然后调用 dump() 就行。
dd() 会让程序停下来,连续多次请求也能持续调试。
与 Mailpit 配合让邮件调试更顺手
把 Mail watcher 和本地 SMTP 服务器 Mailpit 组合起来,邮件开发流程会舒服很多。调试事件与监听器
事件驱动的实现往往难以调试。“事件到底触发没?”、“到底哪个监听器被调用了?”光看日志追这些非常麻烦。 Telescope 的 Events watcher 会把已经派发的事件和监听器都列出来。 如果监听器没被调用,可以在 Events 标签查看事件条目。- 事件已派发但没有显示监听器 → 监听器没注册(检查
EventServiceProvider) - 事件本身就没派发 → 检查
event()的调用点
调试队列作业
异步处理只靠看日志很难定位原因。Telescope 的 Jobs watcher 会记录作业从 dispatch 到执行结果的全过程。 点击失败作业的条目,能看到堆栈跟踪和异常信息。除了queue:failed 表以外,Telescope 也能查看,排查失败原因很快。
调试 HTTP 客户端
调试与外部 API 的通信时,HTTP Client Watcher 很有用。它会记录通过Http:: 门面发起的请求及其响应。
dd($response->json()),直接在面板里就能看。
总结
Laravel Telescope 指南
详细的安装和 watcher 配置请参考指南页面。
Laravel Nightwatch
生产环境的监控用 Nightwatch。