PHP 連接 MySQL 時,localhost、127.0.0.1、本機 IP 觸發完全不同的連線協議、權限匹配、效能特性。本文深度解析三者本質差異、驗證方法、最佳實踐。
| 維度 | localhost | 127.0.0.1 | 本機 IP (如 192.168.1.100) |
|---|---|---|---|
| 協議 | Unix Socket (本地套接字) | TCP/IP (回環介面) | TCP/IP (網卡介面) |
| 網路層 | 繞過 TCP/IP 協議棧 | 走 Loopback 介面 | 走物理/虛擬網卡 |
| 權限匹配 | user@'localhost' | user@'127.0.0.1' | user@'192.168.1.100' 或 user@'%' |
| 防火牆影響 | 無 | 受本地防火牆規則影響 | 受網路/主機防火牆影響 |
| 效能 | 最高 (無網路開銷) | 高 (內核級回環) | 標準網路延遲 |
| PHP 常數 | MYSQL_HOST=localhost | 127.0.0.1 | 具體 IP |
-- 查看用戶宿主定義
SELECT User, Host FROM mysql.user;
-- 典型輸出
+------+-------------+
| User | Host |
+------+-------------+
| root | localhost | -- 匹配 localhost 連線
| root | 127.0.0.1 | -- 匹配 127.0.0.1 連線
| root | % | -- 匹配所有 IP (含本機 IP)
+------+-------------+
關鍵點: localhost 和 127.0.0.1 在權限表中是**不同的宿主值**,必須分別授權。
# 1. localhost → Unix Socket
shell> mysql -h localhost -u root -p
mysql> STATUS;
Connection: Localhost via UNIX socket
# 2. 127.0.0.1 → TCP/IP
shell> mysql -h 127.0.0.1 -u root -p
mysql> STATUS;
Connection: 127.0.0.1 via TCP/IP
# 3. 本機 IP → TCP/IP
shell> mysql -h 192.168.1.100 -u root -p
mysql> STATUS;
Connection: 192.168.1.100 via TCP/IP
mysql.sock 位置,PHP pdo_mysql.default_socket、mysqli.default_socket 配置skip-networking 導致只能 TCP,但 localhost 強制 Socketuser@'localhost' 授權bind-address=127.0.0.1 未配置或配置為 localhostuser@'127.0.0.1' 授權# 簡單基準:10000 次簡單查詢
localhost (Socket): ~0.8 秒
127.0.0.1 (TCP): ~1.2 秒
差異 ~30-50% (視系統負載)
localhost (Unix Socket),效能最高、繞過防火牆127.0.0.1 或服務名 (DNS),Socket 需掛載共享卷bind-address=0.0.0.0、防火牆放行、權限 user@'%' 或具體 IPDB_HOST、DB_SOCKET,避免硬編碼user@'%' 濫用