問題現象
Mac OS Lion 自帶 Apache/PHP,官網 DMG 安裝 MySQL。PHP 使用 localhost 連接失敗,改為 127.0.0.1 或本機 IP 即正常。Java/JDBC 使用 localhost 正常,命令行工具也正常。
根因:Socket vs TCP 協議差異
| 連接方式 | Host 值 | 協議 | Socket 文件 |
| Unix Socket | localhost | 本地文件域套接字 | php.ini 配置路徑 |
| TCP/IP | 127.0.0.1 | 網絡回環接口 | 無需 Socket 文件 |
具體衝突分析
- PHP 默認配置(
/etc/php.ini)三處 Socket 路徑指向 /var/mysql/mysql.sock:
mysql.default_socket
mysqli.default_socket
pdo_mysql.default_socket
- MySQL 實際運行 Socket 文件位於
/tmp/mysql.sock
- 查看方法:
echo "show variables" | mysql | grep socket
echo "status" | mysql | grep socket
# 若有密碼:mysql -u用戶 -p密碼 -e "show variables" | grep socket
- PHP 讀取默認配置找不到 Socket 文件,報錯
No such file or directory
解決方案(二選一)
方案一:修改 PHP 配置(推薦)
; /etc/php.ini
mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock
pdo_mysql.default_socket = /tmp/mysql.sock
修改後 重啟 Apache:sudo apachectl restart
方案二:修改 MySQL 配置
; /etc/my.cnf 或 /usr/local/mysql/my.cnf
[mysqld]
socket = /var/mysql/mysql.sock
[client]
socket = /var/mysql/mysql.sock
修改後 重啟 MySQL。
驗證
PHP 再次使用 localhost 連接 MySQL 成功。
核心知識點
localhost ≠ 127.0.0.1 在 MySQL 客戶端協議層面
- PHP 默認用 Socket,Java/JDBC 默認用 TCP
- Socket 文件路徑**客戶端與服務端必須一致**
- Mac OS 系統自帶 PHP 與官方 MySQL 預設路徑不一致是常見坑
- 上一篇文章: Ubuntu 系統安裝 MySQL 服務器最佳實踐:乾淨環境與 apt-get 一鍵部署
- 下一篇文章: PHP MySQL 連接宿主差異深度解析:localhost vs 127.0.0.1 vs IP 的協議與權限本質
Copyright ©
程式碼之家 All Rights Reserved