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

PHP 連不上 MySQL 但命令行正常:socket 路徑不匹配排查與修復

     編輯:MySQL 綜合教學

故障現象

  • PHP 應用報錯:`SQLSTATE[HY000] [2002] No such file or directory` / `Connection refused`
  • 命令行 `mysql -uroot -p` **完全正常**

根因

PHP 使用的 `mysql.default_socket` (或 `mysqli.default_socket`/`pdo_mysql.default_socket`) **與 MySQL 實際 socket 文件路徑不一致**。

三步修復

1. 獲取真實 Socket 路徑

mysql> SHOW VARIABLES LIKE 'socket';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| socket        | /home/mysql/data/mysql.sock |
+---------------+-----------------------------+

2. 修改 php.ini

; 找到以下三項 (視使用擴展而定),全部設置為真實路徑
mysql.default_socket = /home/mysql/data/mysql.sock
mysqli.default_socket = /home/mysql/data/mysql.sock
pdo_mysql.default_socket = /home/mysql/data/mysql.sock

💡 若使用 `php-fpm`,**必須重啟 php-fpm** 生效:
`systemctl restart php-fpm` 或 `service php7.4-fpm restart`

3. 驗證

connect_errno) {
    echo "失敗: " . $mysqli->connect_error;
} else {
    echo "成功! Socket: " . $mysqli->socket;
}

原理深度

  • **命令行客戶端** 讀取 `[client]` 區塊或編譯時默認 socket 路徑。
  • **PHP PDO/MySQLi** 讀取 `php.ini` 中 `default_socket`,**默認值往往指向編譯時路徑** (如 `/tmp/mysql.sock`),與運行時實際路徑脫節。
  • **TCP 連接繞過 Socket**:若配置 `host=127.0.0.1` (而非 `localhost`),PHP 將走 TCP 3306 端口,**完全繞過 socket 問題**。

替代方案:強制 TCP 連接

// PHP 代碼中
$pdo = new PDO("mysql:host=127.0.0.1;port=3306;dbname=test", "user", "pass");
// 或
$mysqli = new mysqli("127.0.0.1", "user", "pass", "db", 3306);

**優點**:無需改 php.ini,跨機器部署無縫遷移。
**缺點**:本機回環比 Unix Socket 略慢 (微秒級),高併發極致優化時才感知。

檢查清單

  1. `SHOW VARIABLES LIKE 'socket'` 獲取真實路徑
  2. `php.ini` 三處 `default_socket` 全覆蓋
  3. 重啟 PHP-FPM / Apache
  4. 測試腳本驗證連接成功
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved