2017-04-12 135 views
0

我已經完成爲我正在執行的項目編寫我的php腳本。我的下一步是我想看看是否可以從內存的角度來改進我的代碼,因爲我的一些腳本吃了很多內存。我一直在研究這個,一個建議是NULL和未設置變量,但我從來沒有看到這樣做的例子。所以,我想給我的劇本做了共同行動的例子,想知道這是否是這樣做的正確方法:在php腳本中釋放內存

$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

什麼是$ dbconn?自定義數據庫類?看起來不像mysqli或PDO? – SirNarsh

+0

這應該是張貼在http://codereview.stackexchange.com/ – nogad

+0

你沒有看到很多的例子,其幾乎所有的情況下,它的無意義 – nogad

回答

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 
} 
+0

嚴格地說 - '$ stmt-> execute( );'無論如何,'無論如何'取出'它都可能將整個數據集提取到php進程內存中。如果每行都單獨提取,則會非常緩慢。 – zerkms

+0

'execute()'會將準備好的查詢發送到服務器,它不會將整個結果集提取到內存中 – meda

+0

只需檢查它:-)在您的數據庫中生成1億行,準備,執行並獲取單個行。 – zerkms

0

好吧,如果函數$ dbconn-> get_results返回將所有數據的數組,那麼在使用發電機,因爲存儲器已被分配給不點數據。

您還可以使用mysqli_fetch_assoc函數一次獲取一行。它應該是更高的內存效率,然後一次獲取所有行。 http://php.net/manual/en/mysqli-result.fetch-assoc.php