Composer本身不提供数据库连接监控能力,它仅通过scripts字段执行一次性检测脚本(如bin/check-db.php),依赖PDO探活并显式exit(1)反馈结果,不可用于长周期监控。

Composer 本身不提供数据库连接监控能力
Composer 是 PHP 的依赖管理工具,composer.json 中的 scripts 字段只能执行命令行操作(如 PHP 脚本、Shell 命令),它**不内置数据库连接检测逻辑**,也不能持续“监控”——脚本运行完就退出。所谓“用 Composer 监控”,实际是借它的 scripts 快速触发一个轻量检测脚本,适合部署前校验或 CI/CD 流程中做一次性探活。
在 composer.json 中定义数据库连通性检查脚本
把检测逻辑写成独立 PHP 文件(比如 bin/check-db.php),再通过 Composer scripts 调用。这样既复用 Composer 的执行环境(自动加载类、读取 .env),又避免污染主应用代码。
示例配置(composer.json):
{
"scripts": {
"check:db": "php bin/check-db.php"
}
}
bin/check-db.php 可用 PDO 尝试连接并执行 SELECT 1:
<?php
$host = $_ENV['DB_HOST'] ?? '127.0.0.1';
$port = $_ENV['DB_PORT'] ?? '3306';
$dbname = $_ENV['DB_NAME'] ?? 'test';
$user = $_ENV['DB_USER'] ?? 'root';
$pass = $_ENV['DB_PASSWORD'] ?? '';
try {
$pdo = new PDO("mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4", $user, $pass, [
PDO::ATTR_TIMEOUT => 3,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$pdo->query("SELECT 1");
echo "✅ DB connection OK\n";
} catch (PDOException $e) {
echo "❌ DB connection failed: " . $e->getMessage() . "\n";
exit(1);
}
- 务必设置
PDO::ATTR_TIMEOUT,否则网络不通时会卡住默认 30 秒 - 不要在脚本里用
die()或exit(0)隐式成功——CI 工具依赖进程退出码判断结果,必须显式exit(1)表示失败 - 如果项目用 Laravel / Symfony 等框架,优先复用其配置层(如
config/database.php或DatabaseManager),而不是硬编码 DSN
为什么不用 composer run-script 做长周期监控
执行 composer run-script check:db 是单次同步调用:启动 → 检测 → 退出。它没有后台守护、重试策略、告警通道,也不记录历史状态。真要监控,得交给专业工具:
- 进程级:用
supervisord+ 自研心跳脚本(每 10 秒跑一次check:db并写日志) - 基础设施层:Prometheus + MySQL Exporter 抓取
up指标 - APM 工具:New Relic / Datadog 的数据库健康探测
强行用 Composer 脚本轮询,会导致进程残留、日志混乱、退出码语义错乱——它不是为这个场景设计的。
常见错误:环境变量没加载或配置路径不对
Composer scripts 运行时工作目录是项目根目录,但不会自动加载 .env。如果你的检测脚本依赖 $_ENV,必须手动加载:
- 用
vlucas/phpdotenv:在check-db.php开头加(new Dotenv\Dotenv(__DIR__ . '/..'))->load(); - 或改用
getenv()+putenv(),但注意 PHP-FPM 下getenv()可能被禁用 - 调试技巧:在脚本开头加
var_dump($_ENV); die();,确认变量是否就位 - Laravel 用户注意:
artisan tinker能读到的环境变量,composer run-script不一定有——因为 Artisan 启动了完整的应用上下文,而 Composer scripts 没有
最稳妥的方式是让检测脚本接受命令行参数(php bin/check-db.php --host=localhost --port=3306),绕过环境变量依赖。


















