DreamHost 等共享主機常發生 MySQL 服務重啟、OOM Killer 殺進程導致網站報 Error establishing a database connection,且多發生於北京時間深夜,發現滯後數小時。
原理:WordPress 建立連線失敗時會進入 wpdb::__construct() 中的 if (!$this->dbh) 分支,在此注入告警邏輯,零插件、極低開銷。
# 站點根目錄
touch log.txt
chmod 666 log.txt
wp-includes/wp-db.php找到 if ( !$this->dbh ) { (WP 6.x 約第 1600 行),在其 內部 插入:
<?php
// ---- MySQL 連線失敗告警 ----
$from = 'monitor@yourdomain.com';
$to = 'admin@yourdomain.com';
$subject = '【緊急】WordPress MySQL 連線失敗 - ' . $_SERVER['HTTP_HOST'];
$body = sprintf(
"Time: %s\nURL: %s\nRemote IP: %s\nUser Agent: %s",
date('Y-m-d H:i:s'),
(isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],
$_SERVER['REMOTE_ADDR'],
$_SERVER['HTTP_USER_AGENT']
);
$headers = "From: $from\r\nReply-To: $from\r\nX-Mailer: PHP/" . PHP_VERSION;
@mail($to, $subject, $body, $headers);
// 寫入本地日誌 (雙重保障)
$log_line = date('Y-m-d H:i:s') . " | " . $_SERVER['REQUEST_URI'] . "\n";
@file_put_contents(ABSPATH . 'log.txt', $log_line, FILE_APPEND | LOCK_EX);
// ---- End ----
?>
wp-config.php 中 DB_HOST 為錯誤地址log.txt 追加記錄transient 或 Redis 記錄上次告警時間,同一故障 5 分鐘內僅發一次信。/healthz 返回 wpdb::check_connection() 狀態,供 UptimeRobot / Prometheus 抓取。logrotate 定期歸檔 log.txt,防止磁碟撐爆。wp-db.php,建議將告警代碼封裝為 Must-Use Plugin (wp-content/mu-plugins/db-monitor.php) 掛載 dead_db 鉤子 (WP 3.9+ 支援),實現升級免維護。mail() 依賴服務器 sendmail/postfix,若無 MTA 改用 PHPMailer 直連 SMTP。mail(),測試時先在 SSH 執行 echo test | mail -s test admin@domain.com 驗證。十行代碼、零依賴,將「被動發現」升級為「主動感知」。配合 Must-Use Plugin 固化、多渠道告警、健康檢查端點,構建 WordPress 資料庫層的「心跳監測儀」,讓每一次 MySQL 抖動都逃不過你的眼。