为 Laravel 发布状态页的三种方式
选择所需的控制级别 — 零代码、低代码或完全 headless。
托管
添加 Laravel 端点,把 CNAME 指向 status.yourdomain.com,完成。5 分钟搞定。
嵌入式徽章
将 SVG 正常运行时间和状态徽章放入 README 或落地页。每 5 分钟自动更新。
把这个 health 端点加入你的 Laravel 应用
复制、粘贴、把 PulseAPI 指向 URL。健康时返回 200,降级时返回 503。
routes/web.php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
Route::get('/health', function () {
$checks = [];
try {
DB::select('select 1');
$checks['database'] = 'ok';
} catch (\Throwable $e) {
$checks['database'] = 'fail';
}
try {
Redis::ping();
$checks['cache'] = 'ok';
} catch (\Throwable $e) {
$checks['cache'] = 'fail';
}
$healthy = collect($checks)->every(fn ($v) => $v === 'ok');
return response()->json(
['status' => $healthy ? 'healthy' : 'degraded', ...$checks],
$healthy ? 200 : 503
);
})->withoutMiddleware([
\App\Http\Middleware\VerifyCsrfToken::class,
]);跳过 CSRF 和认证中间件。部分故障返回 503。若有严格 throttle 需豁免。
Laravel 应用会出什么故障 — 如何捕获
Horizon 队列滞后
特定队列的积压会破坏异步 UX。队列深度断言可尽早发现。
停止运行的调度器任务
卡住的 cron 让发票未发送。心跳端点 + 对 last-run 断言。
缓存 / 会话驱动故障
Redis 抽风导致间歇性 500。/health 中的缓存检查能揭示。
Headless 视角
不喜欢我们的状态页? 用 Laravel 自己构建。
我们的 API 返回的数据与托管 UI 完全一致。完整 OpenAPI 规范见 api.pulseapi.tech/docs.
获取并渲染状态 API 的 Laravel 控制器。
use Illuminate\Support\Facades\Http;
class StatusController extends Controller
{
public function index()
{
$data = Http::timeout(5)
->get('https://api.pulseapi.tech/status/acme')
->json();
return view('status', ['data' => $data]);
}
}Laravel 监控 — FAQ
能与 Laravel Forge、Vapor 或自部署使用吗?
都可以 — PulseAPI 只需要一个公网 URL。
能否监控 Horizon?
可以。端点读取 Horizon::status() 和队列深度,用 JSON-path 断言特定队列。
能处理 Laravel 维护模式吗?
可以。`php artisan down` 的 503 会触发事件。标记维护窗口可在部署期间抑制告警。
能否在 Laravel 内渲染状态页?
可以。在控制器里调用 API,传给 Blade 视图。