在PHP脚本中释放内存

时间:2017-04-12 23:49:45

标签: php memory-optimization

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

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

2 个答案:

答案 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