2013-07-22 36 views
1

在PHP中編碼時,是否可能創建內存泄漏?PHP變量和內存泄漏

當我通過大循環結構進行迭代時,我似乎得到了非常慢的性能。

我應該unset()我沒有使用的變量?

+2

我們可以看到一些代碼嗎? –

+0

你甚至可以肯定內存泄漏是問題,而不是簡單的低效代碼? –

+0

在循環中爲每個實例使用相同的變量。如果您將'constructs'引用爲類實例化,請使用singleton或在循環上方實例化一個類。通常問題是代碼。 – machineaddict

回答

4

PHP沒有垃圾收集器(雖然它的PHP 5.3一樣)。它使用引用計數來管理內存。因此,最常見的內存泄漏來源是循環引用和全局變量。

最簡單的工具是有選擇地調用memory_get_usage並將其縮小到代碼泄漏的位置。您也可以使用xdebug創建代碼的跟蹤。

用執行跟蹤和show_mem_delta運行代碼。

瞭解更多關於在PHP中的垃圾收集5.3+看到php.net/manual/de/features.gc.php

PHP 5.3 +

在PHP

5.3+有三個主要的地方執行垃圾收集的能力(也有其他人) :

1.當你告訴它。喜歡使用未設置()或了mysql_free_result()

2.當你離開一個函數清除,留下範圍

3.當腳本結束任何變量...很明顯

+0

非常全面的示例感謝您投入時間進行編輯。 – SamuelDobson

0

如果PHP本身沒有bug,那麼內存泄漏不可能發生在php腳本中。

內存清理由PHP garbage collector爲您完成。雖然它在大多數情況下可以很好地工作,沒有編程人員的任何努力,但它可以使用一組函數進行控制。 Manual

0

是的,它可能有內存泄漏Php, 一個基本的方法來看看你是否有O(n)循環內存泄漏是看你的循環時間是否與他的對象數成正比,爲實例100對象比10個對象的循環長約10倍。如果循環對於100個對象來說更長,那麼您可能會有內存泄漏。

+0

你已經引用了擴展開發者的php開發指南。擴展名用C編寫。問題是關於PHP代碼的 – hek2mgl