查詢結果集儲存位置決定緩衝模式:
data_seek()),但大結果集會佔用大量 PHP 記憶體。| 介面 | 預設模式 | 啟用 Buffered | 啟用 Unbuffered |
|---|---|---|---|
| mysql (已移除) | Buffered | 預設即為 Buffered | mysql_unbuffered_query() |
| mysqli | Unbuffered | mysqli_query($link, $sql, MYSQLI_STORE_RESULT) | 預設即為 Unbuffered (MYSQLI_USE_RESULT) |
| PDO | Unbuffered | $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true) | 預設即為 Unbuffered |
<?php
$dbConfig = ['host'=>'10.128.11.101','port'=>'3306','user'=>'test','pass'=>'test','db'=>'test'];
$sql = 'SELECT * FROM so_topic_app';
// ---------- mysql (舊版參考) ----------
$db = mysql_connect($dbConfig['host'], $dbConfig['user'], $dbConfig['pass']);
mysql_select_db($dbConfig['db'], $db);
// Buffered (預設)
$res = mysql_query($sql, $db);
while ($row = mysql_fetch_row($res)) { /* ... */ }
// Unbuffered
$res = mysql_unbuffered_query($sql, $db);
while ($row = mysql_fetch_row($res)) { /* ... */ }
mysql_close($db);
// ---------- mysqli ----------
$mysqli = mysqli_connect($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['db']);
// Unbuffered (預設)
$result = $mysqli->query($sql); // MYSQLI_USE_RESULT
while ($row = $result->fetch_array()) { /* ... */ }
// Buffered
$result = $mysqli->query($sql, MYSQLI_STORE_RESULT);
while ($row = $result->fetch_array()) { /* ... */ }
$result->free();
$mysqli->close();
// ---------- PDO ----------
$dsn = "mysql:dbname={$dbConfig['db']};host={$dbConfig['host']}";
$pdo = new PDO($dsn, $dbConfig['user'], $dbConfig['pass']);
// Unbuffered (預設)
$stmt = $pdo->query($sql);
$data = $stmt->fetchAll(); // 一次性拉取所有行到記憶體(等同 Buffered 行為)
// 真正串流讀取:
// while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { /* ... */ }
// Buffered 設定
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$stmt = $pdo->query($sql);
$data = $stmt->fetchAll();
?>
LIMIT offset, count 查詢。現代專案多使用 **PDO + Buffered(預設屬性開啟)**,配合 fetch() 逐行處理大資料,或 fetchAll() 處理小資料。極少需手動切換 Unbuffered,除非做資料匯出、ETL 等特殊場景。