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

Windows Server 2008/2012 PHP 連接 MySQL 過慢解決方案:localhost vs 127.0.0.1 與 bind-address 設定

     編輯:PHP 綜合知識

現象對比

$start = microtime(true);
$mysqli = new mysqli('127.0.0.1', 'root', '', 'mysql'); // 0.0025 秒
// $mysqli = new mysqli('localhost', 'root', '', 'mysql'); // 超過 1 秒,慢 400 倍
echo microtime(true) - $start;

根本原因:IPv6 解析與 MySQL bind-address 不匹配

  1. my.ini 設定 bind-address=127.0.0.1(僅綁 IPv4 回環)
  2. Windows 7/2008/2012 預設 localhost 解析為 ::1(IPv6 回環)
  3. PHP 嘗試 IPv6 連線失敗後,才回退 IPv4,導致嚴重延遲

三種 bind-address 設定對應行為

bind-address 設定localhost 連線127.0.0.1 連線
127.0.0.1慢(IPv6 失敗回退)快(直接 IPv4)
::1快(直接 IPv6)慢(IPv4 失敗回退)
註解/移除快(雙協定皆聽)快

解決方案(任選一)

方案 A:PHP 連線字串改用 127.0.0.1(最簡單、相容性最好)

$mysqli = new mysqli('127.0.0.1', 'user', 'pass', 'db');
$pdo = new PDO('mysql:host=127.0.0.1;dbname=db', 'user', 'pass');

WordPress、phpMyAdmin 等安裝時預設 localhost,請手動改為 127.0.0.1。

方案 B:my.ini 設定雙協定監聽

# my.ini
[mysqld]
bind-address = ::        # 監聽所有 IPv6 介面(含 ::1)
# 或
bind-address = 0.0.0.0   # 監聽所有 IPv4 介面(含 127.0.0.1)
# 或干脆註解掉 bind-address,預設監聽所有介面

重啟 MySQL 服務生效。

方案 C:Windows hosts 檔案強制 localhost 解析 IPv4

# C:\Windows\System32\drivers\etc\hosts
127.0.0.1 localhost
# 註解掉 ::1 localhost

適用範圍

Windows 7、Windows Server 2008 R2、Windows Server 2012 及更新版本均存在此行為差異。

延伸驗證

# 測試解析
ping localhost
ping 127.0.0.1

# 測試 MySQL 連線
mysql -h 127.0.0.1 -u root -p
mysql -h localhost -u root -p
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved