簡體   English   中英

PHP內存泄漏和分叉

[英]PHP memory leak and fork

我試圖避免PHP中的內存泄漏。 當我創建一個對象並在最后取消它時它仍然在內存中。 未設置看起來像:

$obj = NULL;
unset($obj);

這仍然無濟於事。

我的問題是當我分叉進程時會發生什么,並且會在子線程中創建和銷毀對象? 這會是一樣的嗎? 或者有沒有其他方式如何釋放內存?

這是導入腳本,它會消耗很少的ram。

PHP 5.3有一個垃圾收集器,可以收集循環引用。 嘗試嘗試可能是值得的:

gc_enable();

class A {
  public function __construct() {
    $this->data = str_repeat("A", 1024000);
  }
}

$mem = memory_get_usage();
$a = new A();
$mem2 = memory_get_usage();
$a->a = $a;
$a->a->mydata =  $a->data . 'test';
$mem3 = memory_get_usage();
unset($a);
gc_collect_cycles();
$mem4 = memory_get_usage();      

printf("MEM 1 at start %0.2f Mb\n", ($mem / 1024) / 1024);
printf("MEM 2 after first instantiation %0.2f Mb\n", ($mem2 / 1024) / 1024);
printf("MEM 3 after self-ref: %0.2f Mb\n", ($mem3 / 1024) / 1024);
printf("MEM 4 after unset(\$a): %0.2f Mb\n", ($mem4 / 1024) / 1024);      

輸出:

MEM 1 at start: 0.31 Mb
MEM 2 after first instantiation: 1.29 Mb
MEM 3 after self-ref: 2.26 Mb
MEM 4 after unset($a): 0.31 Mb   

在調用unset()之前,無需將變量設置為NULL。 但請注意,unset()不會強制釋放內存。 你可能要檢查的主要問題是,你的對象會清除你取消它之前, 有大量的數據的任何引用。

那么你的導入腳本首先不應該使用一些ram演出。 當你不完全需要時,嘗試將大塊數據存儲在另一個地方(文件系統或數據庫)。 還要考慮一次導入較小的部分,而不是一個大塊,即使需要更長的時間來處理,但這樣你將權衡大內存消耗。

你所談論的不是內存泄漏,因為這是一個記錄在案的,眾所周知的行為。 正如MathieuK所說,在PHP5.3中你可以使用一些gc *函數但我從未測試過它們。 PHP是一種非常糟糕的語言,用於處理臨時的大塊數據,因為在分配之后,分配的內存將永遠不會被釋放,即使你取消它(這是因為分配的內存將被重用,這在網頁中是一件好事,但在大型“硬核”腳本中並不是一件好事......)。

暫無
暫無

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

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