Can't connect to MySQL server (4)mysql_connect 改 mysql_pconnect 緩解半月,流量恢復後失效代碼中使用 $host = 'db.example.com' 或 '10.x.x.x',每次連接觸發 DNS 解析或經網關轉發。任一環節抖動即連接失敗。
修正: 使用 localhost(Unix Socket)或 127.0.0.1(TCP 本地回環),繞過 DNS/網關。
mysql_connect,高峰期並發數 × 頁面連接數 > max_connectionsmysql_pconnect 復用連接但不釋放,導致睡眠連接佔滿 wait_timeout 窗口共享主機通常限制 max_user_connections、max_connections、CPU/內存配額,單賬號超限即被熔斷。
| 層面 | 措施 | 效果 |
|---|---|---|
| 連接方式 | PDO + ATTR_PERSISTENT => true / 專用連接池(如 ProxySQL、PHP-PM) | 復用連接、減少握手開銷 |
| 主機填寫 | localhost(Socket)優先,失敗回退 127.0.0.1 | 繞過 DNS、網關 |
| 查詢優化 | 消除 N+1、合併 IN 子查詢、覆蓋索引、Redis 緩存熱點 | 降低單請求查詢數與執行時間 |
| 連接參數 | wait_timeout=60、max_user_connections=50(視配額調整) | 加速釋放閒置連接 |
| 架構升級 | 遷移至雲數據庫(RDS/CloudSQL)+ 讀寫分離 + 連接池中間件 | 根治資源爭搶、提供高可用 |
// 錯誤:每次 new 連接
$link = mysql_connect('db.host.com', 'user', 'pass');
// 正確:PDO 單例 + 持久連接
class DB {
private static $pdo;
public static function get() {
if (!self::$pdo) {
self::$pdo = new PDO(
'mysql:host=localhost;dbname=app;charset=utf8mb4',
'user', 'pass',
[PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
}
return self::$pdo;
}
}
虛擬主機階段「能跑通」≠「架構健壯」。流量增長時,連接管理、DNS 依賴、資源配額 三大隱患必爆雷。盡早規劃遷移至受管數據庫服務。