Windows 環境下 PHP 連接 MySQL 出現「連線被重置」(Connection Reset) 或頁面空白無輸出,核心原因是 **`libmysql.dll` 版本衝突或路徑錯誤**。本文提供 Apache/PHP/MySQL 三方版本對齊、DLL 載入順序修正、LoadFile 指令強制綁定三大解決路徑。
| 組件 | 建議版本組合 | 關鍵檔案 |
|---|---|---|
| PHP | 5.6 / 7.4 / 8.x (Thread Safe 版) | php7ts.dll / php8ts.dll |
| Apache | 2.4.x (VC15/VC16 編譯匹配 PHP) | httpd.exe |
| MySQL Client Lib | 與 PHP `mysqlnd` 版本一致或更新 | libmysql.dll |
# httpd.conf 末尾新增 (路徑根據實際安裝調整)
# 關鍵:LoadFile 必須在 LoadModule php_module 之前
LoadFile "D:/PHP/php8.3/libmysql.dll"
LoadFile "D:/PHP/php8.3/php8ts.dll"
LoadModule php_module "D:/PHP/php8.3/php8apache2_4.dll"
PHPIniDir "D:/PHP/php8.3"
AddType application/x-httpd-php .php
> **原理**:Apache 啟動時優先載入指定路徑的 `libmysql.dll`,避免系統 PATH 中舊版 (如 MySQL Server 安裝目錄) 被優先載入導致版本衝突。
# 1. 排查 PATH 中所有 libmysql.dll
where libmysql.dll
# 典型干擾來源:
# C:\Windows\System32\libmysql.dll (舊版殘留)
# C:\Program Files\MySQL\MySQL Server 8.0\bin\libmysql.dll
# C:\xampp\mysql\bin\libmysql.dll
# 2. 刪除或重命名系統目錄下的舊版
rename C:\Windows\System32\libmysql.dll libmysql.dll.bak
# 3. 確保 PHP 目錄在 PATH 最前
setx PATH "D:\PHP\php8.3;%PATH%"
# 重啟 Apache 生效
# 複製 PHP 目錄下的 libmysql.dll 到 Apache/bin/
copy D:\PHP\php8.3\libmysql.dll D:\Apache24\bin\libmysql.dll
# 重啟 Apache
<?php
// test_mysql.php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$mysqli = new mysqli('127.0.0.1', 'root', 'password', 'test', 3306);
echo '✅ 連線成功,Server version: ' . $mysqli->server_info;
$mysqli->close();
} catch (mysqli_sql_exception $e) {
echo '❌ 連線失敗:' . $e->getMessage();
}
?>
| 錯誤做法 | 正確理解 |
|---|---|
| 複製 libmysql.dll 到 System32 | 污染系統目錄,導致其他軟體衝突,嚴禁 |
| 下載網路隨機版本 libmysql.dll | 必須與 PHP 編譯版本 (VC 編譯器、Thread Safe、位元數) 完全一致 |
| 以為是 MySQL Server 版本問題 | 實際是 PHP 客戶端庫 (libmysql.dll) 與 PHP 核心版本不匹配 |
| 忽視 Apache 載入順序 | LoadFile 必須在 LoadModule 之前,確保優先綁定 |
採用 **Apache `LoadFile` 強制綁定 PHP 目錄下的 `libmysql.dll`** 為最佳實踐,徹底解決 Windows 下 PHP-MySQL 版本衝突導致的連線重置問題。