PHP 連接 MySQL 有三種主流介面:mysql (已移除)、mysqli、PDO_MySQL。本文深度對比 mysql 與 mysqli 連線模式、API 風格、效能特性,並給出現代選型建議。
核心差異:連線模式
| 特性 | mysql (舊) | mysqli |
| 連線類型 | 非持久 (短連線) | 持久連線 (長連線) |
| 進程模型 | 每次請求新建進程 | 復用同一進程 |
| 服務器壓力 | 高 (頻繁建連) | 低 (連線復用) |
| PHP 版本 | 5.0-5.6, 7.0 移除 | 5.0+ 至今維護 |
mysqli 兩種 API 風格
1. 程序式 (類 mysql 風格)
$conn = mysqli_connect('localhost', 'root', '123', 'db_test')
or die('Connect Error: ' . mysqli_connect_error());
$sql = "SELECT * FROM db_table";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
echo $row['title'];
}
mysqli_free_result($result);
mysqli_close($conn);
2. 物件導向 (推薦)
$conn = new mysqli('localhost', 'root', '123', 'db_test');
if ($conn->connect_error) die('Connect Error: ' . $conn->connect_error);
$sql = "SELECT * FROM db_table";
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo $row['title'];
}
$result->free();
$conn->close();
mysql 連線變體對比
| 函數 | 連線類型 | 特點 |
mysql_connect() | 短連線 | 每請求建連,腳本結束自動釋放 |
mysql_pconnect() | 長連線 | 進程級連線池,mysql_close() 無效 |
mysqli_connect() | 長連線 (預設) | 物件/程序雙模式,現代標準 |
長連線 (pconnect) 優缺點分析
| 優點 | 缺點 |
| 省去 TCP 三次握手 + 認證開銷 | 佔用連線槽位,高併發易達 max_connections |
| 減少進程建立/銷毀開銷 | 若查詢鎖死,連線永久佔用,影響整個進程池 |
| 適合高頻、輕量查詢 | CGI 模式下無效 (每請求銷毀進程) |
Apache 模組 vs CGI 模式影響
- Apache mod_php:進程常駐,長連線生效,但需監控連線洩漏
- PHP-FPM (FastCGI):Worker 進程復用,長連線同樣生效,連線池由 FPM 管理
- CGI:每請求啟動新進程,長連線無意義
現代選型建議
- 新專案首選 PDO_MySQL:資料庫抽象層、支援多種資料庫、預處理語句、異常處理優雅
- 僅用 MySQL 且偏好 OOP:
mysqli 物件導向 API
- 維護舊專案:逐步遷移至
mysqli 程序式 API (語法相近)
- 絕對避免:
mysql_* 函數 (PHP 7+ 已移除、無預處理、SQL 注入高風險)
關鍵進階特性 (mysqli/PDO 獨有)
- 預處理語句:
prepare() / bind_param() / execute() — 防 SQL 注入、提升重複查詢效能
- 多查詢:
multi_query() 批次執行
- 交易控制:
begin_transaction() / commit() / rollback()
- 非同步查詢:
mysqli::query(..., MYSQLI_ASYNC)
- SSL/壓縮連線:
mysqli::ssl_set()、mysqli::options(MYSQLI_OPT_COMPRESS)
技術債務清理應列入規劃:將所有 mysql_* 遷移至 mysqli 或 PDO,並全面採用預處理語句,是 PHP 專案安全與可維護性的基石。