必须在laravel部署后立即启用sentry异常监控、horizon队列积压告警和redis缓存健康检查:安装sentry/sentry-laravel sdk并正确配置dsn与环境变量;通过路由抛异常验证上报;配置钉钉机器人关键词alert实时告警;用horizon::stats()->waiting()检测队列积压并定时执行;用redis-cli ttl和memory usage检查缓存键存在性与内存占用。

要在生产环境中快速上线 Laravel 应用并确保其稳定运行,必须在部署完成的第一时间就具备异常捕获、队列积压感知和缓存健康检查能力,否则线上故障将完全黑盒化。
部署后立即启用 Sentry 异常监控
安装 Laravel 专用 Sentry SDK,避免使用通用 PHP 包导致事件丢失:
执行 composer require sentry/sentry-laravel,【不要装 sentry/sentry】。
运行 php artisan sentry:publish --dsn=https://xxx@o123.ingest.sentry.io/456,确保 DSN 完整包含协议、组织 ID、项目 ID 和路径。
检查 .env 文件中是否为 SENTRY_LARAVEL_DSN= —— 若写成 SENTRY_DSN,Sentry 初始化会静默失败。
打开 config/sentry.php,确认 'dsn' => env('SENTRY_LARAVEL_DSN') 未被注释,且 'enabled' => true 已启用(开发环境可硬编码绕过环境判断)。
分钟级验证异常上报是否生效
在任意路由闭包中插入裸异常测试: throw new \Exception('test sentry');。
访问该路由,登录 Sentry 控制台 → 切换到「Issues」页 → 刷新页面,确认新事件出现。
若无反应,先查看 Laravel 日志中是否有 Sentry initialized 提示;没有则说明初始化失败,不是 DSN 错就是服务提供者没注册。
【禁止在 tinker 中调用 \Sentry\captureException() 测试】——它跳过 Laravel 生命周期,结果不可信,极易误判。
配置钉钉机器人实现异常实时告警
方法一:在钉钉群设置中添加自定义机器人,安全选项选「自定义关键词」,填入 ALERT。
复制生成的 Webhook 地址(形如 https://oapi.dingtalk.com/robot/send?access_token=xxx)。
进入 Sentry 项目 Settings → Alerts → Rules → 创建新 Rule,触发条件设为「New issue」,动作选「Webhook」,粘贴地址,Payload 中确保 text.content 或 markdown.title 包含 ALERT。
保存后手动触发一次异常,确认钉钉群收到含关键词的推送消息。
监控队列积压:Horizon + 自定义阈值告警
第一步:确认 Horizon 已启动且 API 可访问 —— 访问 /horizon/api/metrics,返回 JSON 即为正常。
第二步:创建命令 php artisan make:command CheckQueueBacklog,在 handle() 中调用 Horizon::stats()->waiting() 获取 default 队列等待数。
第三步:设定积压阈值(例如 > 100),超过时发送通知:Notification::route('mail', config('admin.email'))->notify(new QueueBacklogAlert($waiting));。
第四步:将命令加入系统 crontab,每分钟执行一次:* * * * * cd /var/www/project && php artisan queue:backlog:check >> /dev/null 2>&1。
Redis 层直连检测缓存键健康状态
编写 shell 脚本,用 redis-cli -h $REDIS_HOST -p $REDIS_PORT TTL users:summary 检查关键缓存键存活时间。
若返回 -2,表示键已不存在;返回 -1 表示永不过期 —— 这两类都需告警。
对大缓存键做内存用量检测:redis-cli -h $REDIS_HOST -p $REDIS_PORT MEMORY USAGE config.menu,超 524288 字节(512KB)即触发钉钉通知。
脚本中拼接 JSON 消息时,务必确保 text.content 字段内含具体键名与指标值,便于运维快速定位问题点。











