2011-07-06 117 views
0

我設置了memory_limit to -1。我仍在解決內存問題。PHP內存問題

我正在使用遺留系統,這是遺憾的編碼(:))。我跑apache的基準來檢查系統

AB -n2000 -c100 http://......com/

在日誌文件中我看到這麼多的內存相關的問題併發用戶訪問。

在代碼中它們使用對象緩衝。這可能是問題? object bufferingmemory_limit有關嗎?

回答

1

更改PHP上的內存限制可防止它在超過某個值時被殺死。但是,它並沒有爲您的硬件提供更多內存(或交換)。最終,如果它需要你沒有身體的記憶,那麼事情就會破裂。

+0

所以,如果我使用4GB RAM,並且對於1000個用戶,它只使用2Gb RAM。將memory_limit設置爲-1是否值得? – Sahal

+0

取決於你的操作系統,你的配置等等。其他應用程序/守護程序也需要內存;) – KingCrunch

1

在PHP中的對象緩衝:我不知道它是什麼意思,如果你的意思是輸出緩衝與ob_start和ob_stop它不涉及對象緩衝,並沒有真正影響PHP的內存使用。

PHP的內存使用情況取決於在構建請求的響應時創建的對象的大小。 如果您執行多次相同的請求,每個php執行的內存使用量應該是相同的

對內存使用的'沒有限制'你做的唯一的事情是避免請求崩潰,因爲太多的內存使用。這意味着如果您的問題是索引頁面上的內存使用情況,您可以通過在此設置中設置一些值來輕鬆測試它,然後減小到崩潰(64Mo,32Mo,16Mo,8Mo等)。你不需要那個。

現在,當您使用ab時,您會讓您的apache服務器響應多個並行請求。對於每個PHP請求,您都會創建一個新的Apache進程。而這個新的apache進程將執行一個獨立的PHP事物,並且它將花費與其他進程做同樣的事情相同數量的內存(因爲您請求相同的頁面,並且不同PHP執行之間不共享任何內容,並且每個PHP執行是在一個Apache進程中完成的)。

我假設你正在使用apache與mpm_prefork和mod_php,而不是任何php-fpm或fastcgi php。

所以如果你在這種情況下有內存問題這可能是你允許過多的apache。默認情況下,它是150,如果每個進程需要30Mb的RAM(檢查頂部),那麼它會使30 * 150 = 4.3Go。看到問題了嗎?

3級簡單的解決辦法

  • 減少apache進程(MaxClients的)的數目,並設置MinSpareServer,MaxSpareServer和startserver的該相同量,則不會鬆動時創建和銷燬的Apache進程。
  • 限制PHP應用程序的內存使用情況,那麼你就能夠處理更多的過程(當然,不是那麼容易的,可以是一個漫長的重寫)
  • 使用APC,它降低了內存使用(和加快執行)

,之後的其他解決方案更復雜

  • 工人模式或使用nginx的Apache和才能計算p惠普出了web服務器與PHP-FPM
  • 使用代理緩存像清漆趕上可以被緩存的(僞靜態內容)的請求,並避免請求阿帕奇& PHP太多。