在php脚本中释放内存

在php脚本中释放内存,php,memory-optimization,Php,Memory Optimization,我已经完成了为我正在做的一个项目编写的php脚本。我的下一步是,我想看看我是否可以从内存的角度改进我的代码,因为我的一些脚本占用了大量内存。我一直在做这方面的研究,其中一个建议是对变量进行NULL和unset,但我从未见过这样做的例子。因此,我想给出一个在我的脚本中执行的常见操作的示例,并想知道这是否是正确的方法: $query = $dbconn->get_results("SELECT id,name FROM account WHERE active = 1");

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

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

请仔细阅读,这正是它们的用途

你不想一次获取所有记录,这会像猎枪一样在你的记忆中炸出洞来

相反,如果您希望一次提取一条记录,请先对其进行处理,然后再提取下一条记录

以下是一个例子:

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函数一次获取一行。它应该比一次获取所有行更节省内存

什么是$dbconn?自定义数据库类?看起来不像mysqli或PDO吗?这应该发布在网站上。你看不到很多例子,几乎所有的例子都是这样pointless@SirNarsh严格来说,它是一个名为ezsqls的dbclass-the
$stmt->execute()
无论如何都可能将整个数据集提取到php进程内存中,而不管您如何
提取它。如果单独提取每一行,速度会非常慢。
execute()
只会将准备好的查询发送到服务器,而不会将整个结果集提取到内存中只需检查:-)在数据库中生成1亿行,准备,执行并获取一行。我以前曾以这种方式使用generator处理数百万条记录,从未用完memoryWeird,这不是我在postgresql pdo驱动程序中看到的: