从MySQL获取数据时PHP内存不足

时间:2017-11-01 09:12:08

标签: php 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中的单个用户在单次迭代后才发布?

1 个答案:

答案 0 :(得分:1)

根据关于Buffered and Unbuffered queries的PHP手册:

  

缓冲模式的缺点是可能会有更大的结果集   需要相当多的记忆。记忆将被占用直到所有   对结果集的引用未设置或结果集为   显式释放,这将在请求结束时自动发生   最新的。术语“存储结果”也用于缓冲   模式,因为整个结果集一次存储。

当时支持mysql_ *所以建议的解决方案是使用:mysql_unbuffered_query(),这已经无关紧要了。

因此,如果您只是检索数据,另一种解决方案是使用:mysqli::use_resultmysqli_result::free结合使用