首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP mysqli 連線 MySQL 出現 "too many connections" 實為 socket 路徑錯誤排查記錄

     編輯:PHP 綜合知識

問題現象

將 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

方案二:修正 php.ini 設定 (推薦)

; 修正為實際 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

方案三:使用 TCP 連線而非 Unix Socket

// 使用 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 連線

mysql_connect() 函數參數完整說明

參數說明預設值
server主機名,可含埠 host:port 或 socket 路徑 :/path/to/socket'localhost:3306'
user用戶名伺服器進程擁有者
pwd密碼空字串
newlink相同參數是否強制建立新連線false
clientflag常數組合:SSL、COMPRESS、IGNORE_SPACE、INTERACTIVE0

排查檢查清單

  1. php.ini 中 mysql.default_socket, mysqli.default_socket, pdo_mysql.default_socket 是否一致且正確
  2. MySQL 設定檔 my.cnf 中 socket 參數是否與 PHP 設定一致
  3. Socket 檔案權限是否允許 PHP 進程讀寫 (通常為 mysql:mysql 或 www:www)
  4. SELinux/AppArmor 是否阻擋 socket 存取
  5. 使用 127.0.0.1 測試是否為 socket 路徑問題

教訓總結

看似「連線數過多」的錯誤,實際上可能是客戶端連線建立失敗的誤導性錯誤訊息。排查資料庫連線問題時,優先驗證 socket 路徑一致性,再考慮實際連線數限制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved