我已经为我正在做的项目编写了我的php脚本。我的下一步是我想看看我是否可以从内存的角度改进我的代码,因为我的一些脚本占用了大量的内存。我一直在研究这个,一个建议是NULL和unset变量,但我从来没有看到这样做的例子。所以我想举例说明在我的脚本中完成的常见操作,并想知道这是否是正确的方法:
$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,因为它会立即缩小它。
我知道这个网站可能太模糊了,但是如果有人能告诉我这是否是释放内存的正确方法?或者,如果有不同的方式,请您提供一个示例,以便我可以直观地看到它是如何工作的。提前谢谢!
答案 0 :(得分:0)
请阅读PHP generators,这就是他们的目的。
你不想一次获取所有记录,这会像霰弹枪那样在你的记忆中留下漏洞。
相反,你想要一次获取你的记录,然后处理它然后获取下一个记录。
以下是一个例子:
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
}
答案 1 :(得分:0)
好吧,如果函数$ dbconn-> get_results返回一个包含所有数据的数组,那么使用生成器是没有意义的,因为已经为数据分配了内存。
您还可以使用mysqli_fetch_assoc函数一次获取一行。它应该是更高的内存效率,然后一次获取所有行。 http://php.net/manual/en/mysqli-result.fetch-assoc.php