我有这个脚本:
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。在while的每一次迭代中,memory_get_usage都在增加,所以如果我遍历大量的用户,它会导致问题。为什么$t中的单个用户在while的单次迭代后没有释放?
发布于 2017-11-01 17:56:01
根据关于Buffered and Unbuffered queries的PHP手册
缓冲模式的缺点是较大的结果集可能需要相当多的内存。内存将一直被占用,直到取消设置对结果集的所有引用或显式释放结果集,这将在请求结束最新时自动发生。术语“存储结果”也用于缓冲模式,因为一次存储整个结果集。
当时支持mysql_*,所以建议的解决方案是使用:mysql_unbuffered_query(),这已经不重要了。
因此,如果您只是检索数据,另一种解决方案是使用:结合使用mysqli::use_result和mysqli_result::free
https://stackoverflow.com/questions/47051492
复制相似问题