mysqli_connect / PDO::__construct127.0.0.1 瞬間恢復正常C:\> ping localhost
正在 Ping DESKTOP-ABC [::1] (IPv6) 具有 32 字節的數據:
來自 ::1 的回覆: 時間 <1ms
...
原因鏈:
hosts 預設註釋掉 IPv4 127.0.0.1 localhostlocalhost 返回 IPv6 ::1[::1]:33060.0.0.0:3306 (IPv4) 或未啟用 IPv6 監聽127.0.0.1 成功# PHP 配置
$host = '127.0.0.1'; // 而非 'localhost'
# JDBC URL
jdbc:mysql://127.0.0.1:3306/db
# Python
host = '127.0.0.1'
# .NET
Server=127.0.0.1;Port=3306;
# C:\Windows\System32\drivers\etc\hosts
# 取消註釋或新增
127.0.0.1 localhost
::1 localhost # 保留 IPv6 亦可
# 刷新 DNS 快取
ipconfig /flushdns
[mysqld]
bind_address = ::
# 或
bind_address = *
# 重啟後 netstat -an 可見 :::3306 (IPv6) 和 0.0.0.0:3306 (IPv4)
需 MySQL 5.5.3+ 支援,Windows 防火牆需放行 IPv6 入站 3306。
# 應用層測試
time php -r '$mysqli=new mysqli("localhost","root","pass","db"); echo "ok";'
# 修復前 ~1000ms,修復後 ~1-5ms
# 連線過程追蹤
mysql --protocol=tcp --host=localhost -u root -p -e "SELECT 1;"
# 加 --protocol=tcp 強制 TCP 而非 socket
# 容器內連接宿主機 MySQL
# 錯誤:host.docker.internal 解析 IPv6
# 正確:host.docker.internal (Docker Desktop 自動映射 IPv4)
# 或使用宿主機實際 LAN IP
Windows 7+ localhost 默認解析 IPv6,MySQL 未監聽 IPv6 導致 1 秒超時回退。
最佳實踐:應用配置一律使用 127.0.0.1,不依賴 localhost 解析。