在 Windows 環境 (特別是 64 位元系統) 下配置 Apache + PHP + MySQL 時,常遇到 phpinfo() 正常,但一呼叫 mysqli_connect() 或 PDO::__construct() 就導致瀏覽器顯示「連線被重設」(ERR_CONNECTION_RESET),Apache 錯誤日誌可能無明顯訊息。根因通常是 libmysql.dll 版本衝突或載入順序錯誤。本文提供釐清問題與永久修正方案。
php -m 顯示 mysqli, pdo_mysql 已載入。phpinfo() 正常顯示。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` 或 `httpd-vhosts.conf`) 的 PHP 模組載入區塊,**優先**用 `LoadFile` 指令強制載入 PHP 目錄下的 `libmysql.dll`,確保 PHP 模組與其依賴庫版本一致。
# 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. 其它設定...
不推薦,易造成「DLL 地獄」,未來升級 PHP/MySQL 時極難維護。僅列為參考:
<?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();
?>
PHP 5.3+ 預設編譯選項包含 mysqlnd,它是 PHP 原生 MySQL 驅動,**不依賴 libmysql.dll**,完全避開 DLL 衝突問題。
強烈建議新專案直接使用 PHP 7.4+/8.x + mysqlnd,徹底解決 Windows 下 MySQL 連線崩潰問題。
Windows Apache + PHP 連 MySQL 「連線被重設」 90% 以上為 `libmysql.dll` 載入衝突。在 `httpd.conf` 以 `LoadFile` **優先載入 PHP 目錄下的正確 `libmysql.dll`** 即可永久修正。長遠來看,升級至 **PHP 7.4+ / 8.x 並使用 mysqlnd** 是徹底根治之道。