簡體   English   中英

PHP7的PDO ext是否將整個結果集讀入內存?

[英]Does PHP7's PDO ext read the entire result set into memory?

自從升級到PHP7以來,我已經注意到某些SQL語句不再起作用,而是用盡了內存。

我有以下代碼:

$query = Yii::$app->db->createCommand('select * from tbl_title')->query();
while ($row = $reader->read()) {
    var_dump($row);
    exit();
}

Yii2的數據庫抽象只是PDO上的極薄層,沒有做任何額外的事情。 query()除了在日志文件(Yii2)中添加一行以進行概要分析外,沒有做任何額外的事情,而reader- reader->read()僅調用PDO流的fetch()函數。

但是它引用了我的表的大小(已使用的空間),導致內存不足,即嘗試分配385 MB的進程內存:

允許的內存大小為134217728字節已用盡(嘗試分配385883840字節)

作為一個扳手,如果我使用一個查詢的結果集完全適合PHP過程的128 MB限制,則可以使用。

那么,PHP7是否已更改,我可以將其更改回嗎?

它與PHP7不直接相關。 該問題是由於新的mysqlnd驅動程序引起的,因此即使使用PHP 5.x,您也可能遇到相同的問題。 它實際上是一個錯誤修正,因為即使在尚未分配內存之前,但它並未計入memory_limit

為了避免內存問題,您必須對大型結果集使用無緩沖查詢

因此,對於需要較大數據集的查詢,請按如下所示設置適當的設置:

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

對於進一步的閱讀,由於Nikic的寶貴反饋非常寶貴,因此我在PDO教程中得到了不錯的解釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM