簡體   English   中英

從 MySQL 獲取數據時 PHP 內存不足

[英]PHP out of memory while fetching data from MySQL

我有這個腳本:

class DBWrapper 
{
   private $conn;

   public function __construct()
   {
      $this->conn = mysqli_connect(/* LOGIN INFO */);
   }

   public function select($q)
   {
       return new DBQuery($this->conn, $q);
   }
}

class DBQuery 
{
   private $q;
   private $tmp;
   public function __construct($conn, $q)
   {
     $this->tmp = mysqli_query($conn, $q);

   }

   public function getRow()
   {
      return mysqli_fetch_array($this->tmp)
   }
}

class Users
{
   private $tmp;
   private $dbWrapper;

   public function __construct($db)
   {
     $this->dbWrapper = $db;
   }


   public function getRow()
   {
     return $this->tmp->getRow();
   }

   public function Activate()
   {
     $select = " SELECT * FROM  users";                         

     $this->tmp = $this->dbWrapper->select($select);
   }
}

$users = new Users($db);
$users->Activate(); 

while($t = $users->getRow())
{
    echo memory_get_usage().'<br>';
}

DBWrapper 類在 getRow() 中使用mysqli_fetch_array memory_get_usage 在 while 的每次迭代中都在增加,因此如果我迭代成千上萬的用戶,它會導致問題。 為什么$t的單個用戶在一次迭代后沒有釋放?

根據有關 緩沖和無緩沖查詢的 PHP 手冊:

緩沖模式的缺點是較大的結果集可能需要大量內存。 內存將一直被占用,直到對結果集的所有引用都未設置或結果集被顯式釋放,這將在請求結束期間自動發生。 術語“存儲結果”也用於緩沖模式,因為一次存儲整個結果集。

當時支持 mysql_* ,因此建議的解決方案是使用: mysql_unbuffered_query() ,這已經無關緊要了。

因此,如果您只是檢索數據,另一種解決方案是使用: mysqli::use_resultmysqli_result::free結合使用

暫無
暫無

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

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