php使用mysql_query查詢超大結果集超記憶體的解決方案,phpmysql_query
再使用mysql_query查詢超大結果集的時候會出現超出記憶體限制的致命錯誤,這是因為mysql_query採用的是查詢全部結果然後把結果集全部緩衝到記憶體中的方式。
mysql的查詢還提供了另外一種查詢方式,函數名為mysql_unbuffered_query,這個函數採用的是查出結果後立即操作結果集,並不會把結果集緩衝到記憶體中,這樣就避免了超出記憶體的情況發生。但是使用這個方法的代價就是不能再查詢的時候使用擷取總行之類的方法,因為這種方法是便查詢邊返回結果。同時在使用該方法的時候不能在同一資料庫連結上執行其他的操作,想要執行其他動作的時候必須先終止當前操作,釋放所有未緩衝的sql查詢所產生的結果行,或者重新執行個體化一個資料庫連接,使用新連結進行其他動作。
以下是使用緩衝和不使用緩衝的對比(所查詢的表中有1000多萬行資料):
function selecttest() { try { $pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');// 不使用緩衝結果集方式// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); $sth = $pdo->prepare('select * from test'); $sth->execute(); echo '最初佔用記憶體大小:' . memory_get_usage() . "\n"; $i = 0; while ($result = $sth->fetch(PDO::FETCH_ASSOC)) { $i += 1; if ($i > 10) { break; } sleep(1); print_r($result); echo '佔用記憶體大小:' . memory_get_usage() . "\n"; } } catch (Exception $e) { echo $e->getMessage(); } }
上面使用到的是緩衝所有結果集的方式,運行該函數時將會報超記憶體的錯誤,如下所示:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 57Call Stack: 0.0005 135392 1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0 0.0005 135568 2. test->selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:86 0.0055 142528 3. PDOStatement->execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:57
在執行$sth->execute();時超出記憶體限制;
將// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);這行的注釋去掉後將使用不緩衝結果集的方式,運行該函數將輸出以下內容:
最初佔用記憶體大小:144808Array( [id] => 1 [a] => v [b] => w [c] => i)佔用記憶體大小:145544Array( [id] => 2 [a] => b [b] => l [c] => q)佔用記憶體大小:145544Array( [id] => 3 [a] => m [b] => p [c] => h)佔用記憶體大小:145536Array( [id] => 4 [a] => j [b] => i [c] => b)佔用記憶體大小:145536Array( [id] => 5 [a] => q [b] => g [c] => g)佔用記憶體大小:145536
可以看到,使用不緩衝結果集的方式擷取一行結果所佔用的記憶體是極少的。這樣就結局了超出記憶體限制的問題。
http://www.bkjia.com/PHPjc/1108860.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1108860.htmlTechArticlephp使用mysql_query查詢超大結果集超記憶體的解決方案,phpmysql_query 再使用mysql_query查詢超大結果集的時候會出現超出記憶體限制的致命錯誤,這是...