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

解決 Windows PHP 連接 MySQL 「連線被重設」錯誤:libmysql.dll 載入順序與 LoadFile 指令

     編輯:PHP 綜合知識

在 Windows 環境 (特別是 64 位元系統) 下配置 Apache + PHP + MySQL 時,常遇到 phpinfo() 正常,但一呼叫 mysqli_connect() 或 PDO::__construct() 就導致瀏覽器顯示「連線被重設」(ERR_CONNECTION_RESET),Apache 錯誤日誌可能無明顯訊息。根因通常是 libmysql.dll 版本衝突或載入順序錯誤。本文提供釐清問題與永久修正方案。

錯誤現象

  • php -m 顯示 mysqli, pdo_mysql 已載入。
  • phpinfo() 正常顯示。
  • 執行連接 MySQL 代碼:`$mysqli = new mysqli('localhost', 'root', 'pass', 'db');`
  • 瀏覽器:此網頁無法示 / 連線被重設 (Chrome: ERR_CONNECTION_RESET)。
  • Apache `error.log`:可能無錯誤,或出現 `Parent: child process exited with status 3221225477 (0xC0000005) -- Access Violation`。

根本原因分析

PHP 的 MySQL 驅動 (`php_mysqli.dll`, `php_pdo_mysql.dll`) 依賴 MySQL 客戶端庫 libmysql.dll。Windows 系統目錄 (`C:\Windows\System32`)、Apache `bin` 目錄、PHP 目錄、MySQL `bin` 目錄可能同時存在不同版本的 `libmysql.dll`。Windows DLL 搜尋順序導致載入錯誤版本 (如系統殘留舊版、MySQL Server 版本不相容),造成存取違規崩潰 Apache 工作進程。

解決方案:在 Apache httpd.conf 明確指定 LoadFile

最乾淨、最穩定的做法:在 Apache 設定檔 (`httpd.conf` 或 `httpd-vhosts.conf`) 的 PHP 模組載入區塊,**優先**用 `LoadFile` 指令強制載入 PHP 目錄下的 `libmysql.dll`,確保 PHP 模組與其依賴庫版本一致。

httpd.conf 設定範例


# 1. 載入 PHP 專用 libmysql.dll (必須在 LoadModule php5_module 之前)
LoadFile "D:/PHP/php5.2.13/libmysql.dll"

# 2. 載入 PHP 模組本身 (視 PHP 版本選擇正確檔案)
# PHP 5.2 for Apache 2.2
LoadFile "D:/PHP/php5.2.13/php5ts.dll"
LoadModule php5_module "D:/PHP/php5.2.13/php5apache2_2.dll"

# PHP 7.x/8.x for Apache 2.4 (範例)
# LoadFile "D:/PHP/php8.2/php8ts.dll"
# LoadModule php_module "D:/PHP/php8.2/php8apache2_4.dll"

# 3. PHP 設定
PHPIniDir "D:/PHP/php5.2.13"
AddType application/x-httpd-php .php .php5 .phtml

# 4. 其它設定...

關鍵點

  1. LoadFile libmysql.dll 必須在 LoadModule php_module 之前:確保 Apache 進程啟動載入 PHP 模組前,正確版本的 libmysql.dll 已載入進程記憶體空間。
  2. 使用絕對路徑:避免相對路徑歧義。
  3. 路徑對應你的實際 PHP 安裝目錄:範例中 `D:/PHP/php5.2.13/` 請改為你的實際路徑。
  4. php5ts.dll (或 php8ts.dll) 同理建議 LoadFile:雖非嚴格必要,但同樣能避免系統目錄殘留舊版 DLL 干擾。

替代方案 (不修改 httpd.conf):複製 DLL 到系統/Apache 目錄

不推薦,易造成「DLL 地獄」,未來升級 PHP/MySQL 時極難維護。僅列為參考:

  • 將 PHP 目錄下的 `libmysql.dll` 複製到 `C:\Windows\System32` (64位系統實際為 `C:\Windows\SysWOW64` 給 32位程式用) 或 Apache `bin` 目錄。
  • 重啟 Apache。

驗證修正

  1. 儲存 `httpd.conf`,重啟 Apache (`httpd -k restart` 或服務管理員)。
  2. 瀏覽 `phpinfo()` 確認 MySQLi / PDO MySQL 區塊顯示 Client API library version 指向正確版本** (如 `mysqlnd 5.0.12-dev` 或 `libmysql - 5.1.37`)。
  3. 執行連接測試腳本:
<?php
$mysqli = @new mysqli('127.0.0.1', 'root', 'your_password', 'test');
if ($mysqli->connect_errno) {
    die("連線失敗: " . $mysqli->connect_error);
}
echo "連線成功! Server version: " . $mysqli->server_info;
$mysqli->close();
?>

現代環境建議:改用 mysqlnd (MySQL Native Driver)

PHP 5.3+ 預設編譯選項包含 mysqlnd,它是 PHP 原生 MySQL 驅動,**不依賴 libmysql.dll**,完全避開 DLL 衝突問題。

  • 編譯/安裝 PHP 時啟用:`--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd`
  • Windows 官方預編譯二進制檔 (php.net/downloads) **預設已使用 mysqlnd** (檔名含 `mysqlnd` 或無 `libmysql.dll` 相依)。
  • 若 `phpinfo()` 顯示 `Client API library version => mysqlnd 5.0.12-dev ...` 即表示正在使用 mysqlnd,**完全不需要 libmysql.dll**。

強烈建議新專案直接使用 PHP 7.4+/8.x + mysqlnd,徹底解決 Windows 下 MySQL 連線崩潰問題。

常見誤區提醒

  • ❌ 懷疑 64 位系統不相容 → 實為 DLL 版本衝突,非架構問題。
  • ❌ 懷疑 PHP 代碼錯誤 → `substr()` 等純 PHP 函數正常,只有涉及 MySQL 連線才崩潰,確為擴展層級問題。
  • ❌ 只複製 `libmysql.dll` 到 `System32` → 污染系統環境,其他軟體可能受影響。
  • ✅ **LoadFile 指定 PHP 專屬 DLL** → 乾淨、隔離、可維護。

結語

Windows Apache + PHP 連 MySQL 「連線被重設」 90% 以上為 `libmysql.dll` 載入衝突。在 `httpd.conf` 以 `LoadFile` **優先載入 PHP 目錄下的正確 `libmysql.dll`** 即可永久修正。長遠來看,升級至 **PHP 7.4+ / 8.x 並使用 mysqlnd** 是徹底根治之道。

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