將 mysql 改為 mysqli 後出現:
Warning: mysqli::real_connect(): (HY000/1040): too many connections
但 SHOW PROCESSLIST 顯示實際連線數極少,非真正連線數過多。
手動編譯安裝 MySQL 指定了非標準路徑,導致 mysql.sock 檔案位置變更。PHP 預設尋找 /tmp/mysql.sock,找不到 socket 檔案時,mysqli 客戶端誤報「too many connections」。
# 搜尋所有設定檔中的 socket 路徑 $ grep -r "mysql.sock" /etc/ /etc/php.ini:pdo_mysql.default_socket=/data/runsock/mysqlsock/mysql.sock /etc/php.ini:;mysql.default_socket = /tmp/mysql.sock /etc/php.ini:mysql.default_socket = /data/runsock/mysqlsock/mysql.sock /etc/php.ini:mysqli.default_socket = /data/runsock/mysql.sock # 錯誤!實際在 mysqlsock 子目錄
ln -s /data/mysqldb/mysql.sock /tmp/mysql.sock
; 修正為實際 socket 路徑 mysql.default_socket = /data/runsock/mysqlsock/mysql.sock mysqli.default_socket = /data/runsock/mysqlsock/mysql.sock pdo_mysql.default_socket = /data/runsock/mysqlsock/mysql.sock
修改後必須重啟 PHP-FPM:
service php-fpm restart
// 使用 127.0.0.1 (TCP) 而非 localhost (Unix Socket)
$mysqli = new mysqli('127.0.0.1', 'username', 'password', 'database', 3306);
關鍵差異:
localhost → 嘗試 Unix Socket 連線127.0.0.1 → 強制 TCP/IP 連線| 參數 | 說明 | 預設值 |
|---|---|---|
server | 主機名,可含埠 host:port 或 socket 路徑 :/path/to/socket | 'localhost:3306' |
user | 用戶名 | 伺服器進程擁有者 |
pwd | 密碼 | 空字串 |
newlink | 相同參數是否強制建立新連線 | false |
clientflag | 常數組合:SSL、COMPRESS、IGNORE_SPACE、INTERACTIVE | 0 |
php.ini 中 mysql.default_socket, mysqli.default_socket, pdo_mysql.default_socket 是否一致且正確my.cnf 中 socket 參數是否與 PHP 設定一致mysql:mysql 或 www:www)127.0.0.1 測試是否為 socket 路徑問題看似「連線數過多」的錯誤,實際上可能是客戶端連線建立失敗的誤導性錯誤訊息。排查資料庫連線問題時,優先驗證 socket 路徑一致性,再考慮實際連線數限制。