我有这个脚本:
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
中的单个用户在单次迭代后才发布?
答案 0 :(得分:1)
根据关于Buffered and Unbuffered queries的PHP手册:
缓冲模式的缺点是可能会有更大的结果集 需要相当多的记忆。记忆将被占用直到所有 对结果集的引用未设置或结果集为 显式释放,这将在请求结束时自动发生 最新的。术语“存储结果”也用于缓冲 模式,因为整个结果集一次存储。
当时支持mysql_ *所以建议的解决方案是使用:mysql_unbuffered_query()
,这已经无关紧要了。
因此,如果您只是检索数据,另一种解决方案是使用:mysqli::use_result
与mysqli_result::free
结合使用