spatie/laravel-health 可快速搭建健康监控,但需执行 health:install 注册路由、php 版本 ≥8.1、databasecheck 需手动加 timeout 或自定义查询、通知配置走 services.php 而非 health.php。

直接用 spatie/laravel-health 就能搭出可落地的健康监控,不需要自己从零写检查逻辑,也不必硬塞进日志或自建 API。
health:install 后访问 /health 404?路由没注册成功
常见于 Laravel 9+ 项目里跳过了 php artisan health:install 命令。这个命令不是可选的——它会往 routes/web.php 插入一条 Route::get('/health', ...) 路由。只跑 vendor:publish 不会自动加路由。
- 确认是否执行过
php artisan health:install;没执行就补上 - 如果已执行但还是 404,检查
routes/web.php末尾是否真有那行路由(有时被 IDE 自动格式化删掉了) - Laravel 10+ 默认禁用 web 中间件组的自动加载,若用了自定义路由文件,需手动确保该路由进了
web中间件栈
PHP 8.0 下 is_string() 报错?版本不兼容必须处理
spatie/laravel-health v3.x 要求 PHP 8.1+,在 8.0 环境下运行时,Result 类里调用的 is_string() 会直接触发 Call to undefined function。这不是配置问题,是语言层不支持。
- 最稳妥解法:升级 CLI PHP 到 8.1.0+(推荐 8.1.28 或 8.2.x LTS)
- 临时方案:降级包到
spatie/laravel-health:^2.18,但会丢失并发检查、自定义 UI 和部分新 Check 类 - 别试图用
function_exists('is_string')手动打补丁——v3 的类型推导和返回结构依赖 8.1+ 行为,补丁后可能静默失败
数据库连接检查通过但实际慢?默认只测连通性,不测响应延迟
DatabaseCheck::new() 默认只执行 DB::connection()->getPdo(),只要能拿到 PDO 实例就标为 success。它不执行真实查询,也无超时控制,所以即使数据库卡在锁表或主从延迟严重,健康端点仍显示绿色。
- 如需测可用性,应组合使用:
DatabaseCheck::new()->timeout(2) - 更进一步,可自定义一个检查类,执行
select 1并设microtime(true)计时,超过阈值标为 warning - 注意:高频轮询带查询的健康检查会加重 DB 负担,生产环境建议间隔 ≥30 秒,且避免在高负载时段密集触发
通知发不出去?Slack/email 配置不在 health.php 里
spatie/laravel-health 的通知通道(如 Slack、Mail)配置**不走 config/health.php**,而是复用 Laravel 自身的通知系统。也就是说,你得先确保 config/services.php 里的 slack 或 mail 配置正确,并且 NOTIFICATION_CHANNEL=slack 这类 env 变量已设置。
- 检查
config/services.php是否有'slack' => ['url' => env('SLACK_WEBHOOK_URL')] - 确认
config/health.php中的'notifications' => ['channels' => ['slack']]是启用状态 - 测试通知是否通:运行
php artisan health:run-checks --notify,观察日志或 webhook 是否收到请求
真正难的不是加几个 Check,而是让每个 Check 的阈值贴合你的服务器规格和业务节奏——比如 CPU 负载告警设成 1.2 在单核机器上合理,在 32 核上就是误报;磁盘预警线设 70%,但若日志轮转策略失效,2 小时内就会爆满。这些细节不会写在文档里,得靠你盯着几次故障回溯出来。











