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

Windows PHP 連接 MySQL 連線被重置:libmysql.dll 路徑衝突完整解決方案

     編輯:PHP 相關知識

Windows 環境下 PHP 連接 MySQL 出現「連線被重置」(Connection Reset) 或頁面空白無輸出,核心原因是 **`libmysql.dll` 版本衝突或路徑錯誤**。本文提供 Apache/PHP/MySQL 三方版本對齊、DLL 載入順序修正、LoadFile 指令強制綁定三大解決路徑。

錯誤現象與根因

  • 瀏覽器顯示「連線已重置」/「無法存取網站」/空白頁。
  • Apache `error.log` 無明確錯誤,或出現 `Parent: child process exited with status 3221225477` (DLL 載入失敗)。
  • 根因:PHP 內建 `mysqlnd` (原生驅動) 與外部 `libmysql.dll` (MySQL 官方客戶端庫) 版本不匹配,導致 Apache 進程崩潰。

環境版本對齊檢查清單

組件建議版本組合關鍵檔案
PHP5.6 / 7.4 / 8.x (Thread Safe 版)php7ts.dll / php8ts.dll
Apache2.4.x (VC15/VC16 編譯匹配 PHP)httpd.exe
MySQL Client Lib與 PHP `mysqlnd` 版本一致或更新libmysql.dll

解決方案一:Apache httpd.conf 強制載入正確 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 安裝目錄) 被優先載入導致版本衝突。

解決方案二:清理系統 PATH 中的干擾 DLL

# 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 生效

解決方案三:複製 DLL 到 Apache bin 目錄 (傳統做法、易遺漏更新)

# 複製 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();
}
?>

進階:PHP 8.1+ 棄用 libmysql.dll 改用 mysqlnd

  • PHP 8.1+ **預設編譯 `mysqlnd` (MySQL Native Driver)**,不再需要外部 `libmysql.dll`。
  • 若 `phpinfo()` 顯示 `mysqlnd` 版本且無 `Client API library version` 顯示 `libmysql`,則無需處理 DLL。
  • 檢查 `php.ini` 確認未強制載入舊擴充:`;extension=mysqli` 應為 `extension=mysqli` (使用 mysqlnd)。

常見誤區對照

錯誤做法正確理解
複製 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 版本衝突導致的連線重置問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved