0

我已经为我正在做的一个项目编写了我的 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,因为它会立即缩小它。

我知道这对于这个网站来说可能太模糊了,但是如果有人可以让我知道这是否是释放内存的正确方法?或者,如果有不同的方法,您能否提供一个示例,以便我可以直观地看到它是如何工作的。提前致谢!

4

2 回答 2

0

请阅读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
}
于 2017-04-13T00:09:37.370 回答
0

好吧,如果函数 $dbconn->get_results 返回一个包含所有数据的数组,那么使用生成器就没有意义了,因为内存已经为数据分配了。

您还可以使用 mysqli_fetch_assoc 函数一次获取一行。它应该比一次获取所有行更节省内存。http://php.net/manual/en/mysqli-result.fetch-assoc.php

于 2017-04-14T04:09:31.170 回答