Laravel Telescope 是请求生命周期快照记录器,非运行时性能分析器;安装需确保环境启用、数据库可写且连接可用;调试应关注Exceptions/ Jobs/ Cache二级菜单;需调大size_limit、启用with_bindings、自定义dump记录;生产环境须限制IP、授权及自动剪裁。
Laravel Telescope 是 Laravel 官方提供的调试与监控工具,它不是“运行时性能分析器”,而是“请求生命周期快照记录器”——它不帮你找 CPU 瓶颈,但能让你秒懂为什么某个请求返回了 500、为什么队列任务没执行、为什么 Redis 缓存没命中。
安装 Telescope 需要绕开两个典型陷阱
很多人执行
后直接
就报错,核心问题在环境和权限:
Telescope 默认只在
和
环境启用,若你在
中设了
,它压根不启动——检查
中的
闭包,确保它返回
(或临时改成
)
会发布迁移并尝试写入数据库;如果你用 SQLite,路径权限不对(如
不可写),迁移会静默失败——运行前先
确认写权限
别漏掉
;Telescope 的表依赖主应用的数据库连接,如果
指向的是只读从库,迁移会失败
Telescope 面板里最常被忽略的三个入口
面板首页默认只显示最近请求,但真正有用的调试信息藏在侧边栏二级菜单里:
:不只是报错堆栈。点进去后,每条异常右侧有
标签页——能看到触发该异常的完整 HTTP 请求头、输入数据、中间件执行顺序,甚至 Session ID。比
直观十倍
:注意顶部筛选器里的
和
切换。很多队列任务卡住不是因为失败,而是根本没被 dispatch 出去——看
列表是否为空,再查
中是否误加了
:别只盯着
数字。点开某次
操作,看
字段是否含动态变量(比如
却没替换),以及
是否为
(表示永不过期,可能内存泄漏)
如何让 Telescope 记录更多关键上下文?
默认配置下,Telescope 会过滤掉大体积数据(如上传文件、长 JSON 响应),但某些调试场景恰恰需要它们:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
在
的
数组中,找到
配置项,把
改成
(单位 KB),否则 POST 的大表单会被截断
想记录 SQL 查询的绑定参数?确认
的
下面加一行
,否则你只看到
,看不到实际传入的
值
自定义记录日志?不要直接改
,而是在
里调用
,然后用
—— 这样变量内容会出现在
标签页,且支持展开数组/对象
生产环境开启 Telescope 的底线操作
Telescope 绝对不能裸奔上线,但完全禁用又失去监控价值。最小安全闭环是:
在
中,把
改为
,并在
中设
仅限特定 IP
重写
方法,在
中添加闭包,只允许
或已登录的管理员访问
必须设置
:在
中配
,否则几天后 MySQL 表暴涨到 GB 级,
变成慢查询元凶
Telescope 的价值不在“功能多”,而在“所有数据都带上下文关联”——一次失败的队列任务,你能顺着
三步跳转,还原出完整因果链。但前提是,你得知道哪些开关要打开、哪些数据默认被剪裁、哪些入口藏在二级菜单里。
composer require laravel/telescope --devphp artisan telescope:installlocaltesting.envAPP_ENV=stagingconfig/telescope.phpenabledtruereturn true;telescope:installdatabase/database.sqlitels -l database/database.sqlitephp artisan migrateDB_CONNECTIONExceptionsRequeststorage/logs/laravel.logJobsFailedDispatchedDispatchedapp/Providers/AppServiceProvider.phpQueue::fake()CacheHits/MissesgetKeyuser:{{ $id }}TTL0config/telescope.phpwatchersRequestWatcher'size_limit' => 641024QueryWatcher'slow' => 100'with_bindings' => trueselect * from users where id = ?idLogWatcherAppServiceProvider::boot()Telescope::recordDump()dump($var)Dumpsconfig/telescope.phpenabledenv('TELESCOPE_ENABLED', false).envTELESCOPE_ENABLED=trueTelescope::auth()AppServiceProviderrequest()->ip() === '192.168.1.100'pruningtelescope.php'prune' => [ 'hours' => 1 ]telescope_entriesuse Laravel\Telescope\Telescope;
// AppServiceProvider.php boot() 内
Telescope::auth(function ($request) {
return $request->ip() === '203.0.113.42' ||
(auth()->check() && auth()->user()->is_admin);
});
Jobs → Exceptions → Request