2009-06-10 54 views
0

好的人裏面如何找到和修復memleaks,的Apache + PHP + WIN2K3

我們有阿帕奇2.2.11運行Windows Server 2003(小型企業版)中,對mod_php的5.2.9-2和每個請求都會有4到8MB左右的內存,然後是大約2到6MB的空閒空間。基本上,Apache發佈的數量總是明顯少於它在請求期間分配的數量(幾兆字節),並且幾小時後,httpd.exe進程最終消耗了所有可用的RAM並且服務器掛起。

這種行爲發生在我們使用相同的代碼庫的Windows XP開發框和下面的CONFIGS可言:

  • XP /阿帕奇2.2.11/PHP5.2.9-2/MySQL 5.1中。 34
  • XP/2.0.x版本的Apache(各種)/PHP5.2.7/MySQL 5.0.67
生產服務器(WIN2K3)上

簡單的PHP腳本不會出現泄漏例如:

  • 基本PHP回聲功能
  • 創建和引用類
  • 輸出緩衝
  • PDO與不持久連接

當運行我們的全部應用程序,然而,事情開始泄漏。我們能想到的唯一的事情就是使用對象,會話細節,全局變量 - 但是我怎樣才能知道泄漏是什麼?那是什麼造成的?在不破壞太多的唯一的機器,我們可以重複這個問題?

回答

1

PHP有它自己的記憶功能,您可以創建__destroy魔術功能來監視對象。我個人會做一個測試副本,做一些編輯,這樣你可以監測內存,看看它增加或減少的地方。

我個人認爲這是一個緩存問題,隨着內存的增加,但如果它使系統不穩定,那顯然不是那麼容易。

echo "Before SomeStrangeObject == ".memory_get_usage()."<br>"; 
    $x = new SomeStrangeObject(); 
    echo "During SomeStrangeObject == ".memory_get_usage()."<br>"; 
    unset($x); 
    echo "After SomeStrangeObject == ".memory_get_usage()."<br>"; 

而只是尋找明顯的韭菜。對不起,我不能再有幫助了。

+0

嗯。我們從不做任何明確的未設置()或使用__destroy。我們的腳本本身在執行結束之前調用memory_get_usage()之後使用大約8MB。我們假設Apache將能夠從該特定請求中恢復內存。我假設現在不太安全呢? – spronkey 2009-06-11 22:12:53