[英]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_result
與mysqli_result::free
結合使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.