萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL localhost 無法連線但 127.0.0.1 正常:PHP 與 MariaDB socket 路徑不一致排查

現象

CentOS 6.3 編譯安裝 MariaDB 後,PHP 探針測試:localhost 連線失敗,127.0.0.1 卻正常。

根本原因

  • localhost 在 MySQL 客戶端協定中預設使用 **Unix Domain Socket** 連線。
  • 127.0.0.1 則強制使用 **TCP/IP** 連線(port 3306)。
  • 編譯安裝 MariaDB 時指定的 socket 路徑為 /usr/local/mysql/tmp/mysql.sock。
  • PHP 編譯預設尋找 socket 路徑為 /var/run/mysqld/mysqld.sock(或 /tmp/mysql.sock),兩者不一致導致 localhost 找不到 socket 而連線失敗。

解決步驟

1. 確認實際 socket 位置

mysql_config --socket
# 或
SHOW VARIABLES LIKE 'socket';

假設輸出 /usr/local/mysql/tmp/mysql.sock。

2. 修改 php.ini 指定正確 socket

找到 php.ini(php --ini 查看),在 [MySQL]、[mysqli]、[pdo_mysql] 區段分別設定:

mysql.default_socket = /usr/local/mysql/tmp/mysql.sock
mysqli.default_socket = /usr/local/mysql/tmp/mysql.sock
pdo_mysql.default_socket = /usr/local/mysql/tmp/mysql.sock

3. 重載 PHP-FPM / Apache

systemctl reload php-fpm
# 或
systemctl restart httpd

替代方案:建立軟連結(不改 php.ini)

ln -s /usr/local/mysql/tmp/mysql.sock /var/run/mysqld/mysqld.sock
# 或
ln -s /usr/local/mysql/tmp/mysql.sock /tmp/mysql.sock

需確保目錄存在且權限正確(mysql:mysql)。

驗證

php -r "new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); echo 'OK';"

補充:/etc/hosts 與 SELinux 非本案主因

  • /etc/hosts 已含 127.0.0.1 localhost 仍失效,說明非 DNS/主機名解析問題。
  • SELinux 設為 permissive/disabled 仍失效,排除安全模組阻擋。
copyright © 萬盛學電腦網 all rights reserved