我已经为我正在做的一个项目编写完了php脚本。我的下一步是,我想看看我是否可以从内存的角度改进我的代码,因为我的一些脚本会消耗大量内存。我一直在对此进行研究,一个建议是 NULL 和取消设置变量,但我从未看到这样做的例子。因此,我想举一个在我的脚本中完成的常见操作的示例,并想知道这是否是执行此操作的正确方法:
$query = $dbconn->get_results("SELECT id,name FROM account WHERE active = 1");
if(isset($query))
{
foreach($query AS $currq)
{
$account_id = intval($currq->id);
$account_name = trim($currq->name);
//Code to stuff with this data
//NULL the variables before looping again
$account_id = NULL;
$account_name = NULL;
//Unset the variables before looping again
unset($account_id);
unset($account_name);
}
$query = NULL;
unset($query);
$currq = NULL;
unset($currq);
这是释放内存的正确方法吗?我读到PHP中的垃圾收集可能很懒惰,所以这就是为什么他们建议NULL 该值,因为它会立即缩小它。
我知道这对这个网站来说可能太模糊了,但如果有人可以让我知道这是否是释放内存的正确方法?或者,如果有其他方法,您能否提供一个例子,以便我可以直观地看到它是如何工作的。提前感谢!
请阅读PHP生成器,这就是它们的用途。
您不想一次获取所有记录,这会像霰弹枪一样在您的记忆中炸出洞。
相反,您希望一次获取一条记录,处理它,然后获取下一条记录。
下面是一个示例:
function getAccountData(PDO $pdo)
{
$stmt = $pdo->prepare("SELECT id,name FROM account WHERE active = 1");
$stmt->execute();
while ($row = $stmt->fetch()) {
yield $row;
}
}
foreach (getAccountData($pdo) as $account){
//process the record for each iteration
//no need to unset anything
}
好吧,如果函数 $dbconn->get_results 返回一个包含所有数据的数组,那么使用生成器就没有意义了,因为内存已经为数据分配了。
您还可以使用 mysqli_fetch_assoc 函数一次获取一行。它应该比一次获取所有行更节省内存。http://php.net/manual/en/mysqli-result.fetch-assoc.php