簡體   English   中英

在php腳本中釋放內存

[英]Freeing up memory in php script

我已經為正在執行的項目編寫了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值設為NULL的原因,因為它將立即縮小它。

我知道這對於該站點可能太含糊,但是是否有人可以讓我知道這是否是釋放內存的正確方法? 或者,如果有其他方法,請提供一個示例,以便我可以直觀地看到其工作方式。 提前致謝!

請仔細閱讀PHP生成器 ,這就是它們的確切用途。

您不想一次獲取所有記錄,這會像a彈槍一樣在您的內存中造成漏洞。

相反,您想一次獲取一個記錄,然后對其進行處理,然后獲取下一個記錄。

這是一個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM