從資料庫查詢大量資料時會出現內容不夠的提示:
php fatal error: allowed memory size of 268 435 456 bytes exhausted
這個問題在php的官方**上叫緩衝查詢和非緩衝查詢(buffered and unbuffered queries)。php的查詢預設模式是緩衝模式。也就是說,查詢資料結果會一次全部提取到記憶體裡供php程式處理。這樣給了php程式額外的功能,比如說,計算行數,將指標指向某一行等。更重要的是程式可以對資料集反覆進行二次查詢和過濾等操作。但這種緩衝查詢模式的缺陷就是消耗記憶體,也就是用空間換速度。
相對的,另外一種php查詢模式是非緩衝查詢,資料庫伺服器會一條一條的返回資料,而不是一次全部返程式設計客棧回,這樣的結果就是php程式消耗較少的記憶體,但卻增加了資料庫伺服器的壓力,因為資料庫會一直等待php來取資料,一直到資料全部取完。
很顯然,緩衝查詢模式適用於小資料量查詢,而非緩衝查詢適應於大資料量查詢。
對於php的緩衝模式查詢大家都知道,下面列舉的例子是如何執行非緩衝查詢api。
非緩衝查詢方法一:mysqli
<?php $mysqli = new mysqli("localhost", "my_user", "my_pa", "world");
$uresult = $mysqli->query("select name from citywww.cppcns.com", mysqli_use_result);
if ($uresult)
} $uresult-&gwww.cppcns.comt;close();
?>
非緩衝查詢方法二:pdo_mysql
<?php $pdo = new pdo("mysql:host=localhost;dbname=world", 'my_user程式設計客棧', 'my_pass');
$pdo->setattribute(pdo::mysql_attr_use_buffered_query, false);
$uresult = $pdo->query("select name from city");
if ($uresult)
} ?>
非緩衝查詢方法三: mysql
<?php $conn = mysql_connect("localhost", "my_user", "my_pass");
$db = mysql_select_db("world");
$uresult = mysql_unbuffered_query("select name from city");
if ($uresult)
} ?>
本文標題: php查詢大量資料記憶體耗盡問題的解決方法
本文位址:
如何解決PHP查詢大量資料記憶體耗盡的問題
從資料庫查詢大量資料時會出現內容不夠的提示 php fatal error allowed memory size of 268 435 456 bytes exhausted 這個問題在php的官方 上叫緩衝查詢和非緩衝查詢 buffered and unbuffered queries php的...
PHP大量資料迴圈時記憶體耗盡問題的解決方案
最近在開發乙個php程式時遇到了下面的錯誤 php fatal error allowed memory size of 268 435 456 bytes exhausted 錯誤資訊顯.分析 開發的這個程式是要用乙個foreach迴圈語句在乙個有10萬條記錄的表裡全表搜尋具有特定特徵的資料,也就...
PHP查詢MySQL大量資料的記憶體
這篇文章主要是從原理,手冊和原始碼分析在php中查詢mysql返回大量結果時,記憶體占用的問題,同時對使用mysql c api也有涉及。昨天,有同事在php討論群裡提到,他做的乙個專案由於mysql查詢返回的結果太多 達10萬條 從而導致php記憶體不夠用。所以,他問,在執行下面的 遍歷返回的my...