2012-08-03 50 views
3

我正在構建一個測試工具來執行舊版PHP代碼的目錄,它是極端難以進行單元測試,雖然我正在使用PHPUnit這個工具。PHP「Uninclude」或從內存中刪除?

有關PHPUnit的一件很酷的事情是,它會將PHP通知,警告和錯誤引發異常。使用這一點知識,我已經構建了一個工具,以遞歸方式從try/catch塊中的目錄中獲取include()文件並記錄任何異常。

問題是,如果我包含數百個文件,這可能會很快變成內存耗盡和崩潰。我已經使用這個考慮,但我不知道這是否從內存中「清除」它:

// Include file into buffer 
ob_start(); 

include($file); 

// Clear file from buffer 
ob_clean(); 

什麼是處理這種性質的東西,並適當地管理內存/資源的最佳方法是什麼?

[編輯]

此外,這是一個內部的工具,我發展,以幫助管理包含不可測(在時間約束感)遺留程序代碼文件的數千人。

這是怎麼回事?

// Enable garbage collector (in case this helps?) 
gc_enable(); 

// Get procedural php and execute it 
$fileData = file_get_contents($file); 
eval($fileData); 

// Clear variable 
$fileData = null; 
+1

那麼,你的輸出緩衝區與你的應用程序完全沒有關係。這只是用於將數據發送回發送到瀏覽器的Web服務器。你需要另一種方法,我懷疑它會降到沙盒。 http://php.net/manual/en/runkit.sandbox.php – Brad 2012-08-03 14:14:53

+0

你不能「uninclude」。您可以嘗試取消設置變量,但函數和對象不能被「刪除」。 – 2012-08-03 14:15:18

+0

您可以在包含之前和之後區分'$ GLOBALS',然後一旦完成了該文件,就可以取消設置diff'd變量。 – 2012-08-03 14:15:21

回答

1

如果你創建一個單獨的CLI腳本(「測試」),其中將包括一次一個文件,並記錄異常,並有主腳本(以下簡稱「迭代」)遍歷/遞歸到需要測試腳本的目錄並通過shell爲每個文件調用測試腳本?

+0

這是要麼我或使用PCNTL運行每個迭代作爲一個單獨的過程。雖然你的想法可能會更容易被暗示,但是這要感謝這個建議。 – 2012-08-04 15:59:16

+0

哦,有趣的是,我甚至都沒有意識到PCNTL。這聽起來像是我的建議會更容易實施,所以如果它能夠充分發揮作用並且PCNTL沒有爲您的問題提供重要或必要的優勢,那就很有吸引力。別客氣。 – JMM 2012-08-04 16:03:41