2012-07-13 30 views
16

給出一些上下文:apache PHP內存使用情況如何真正起作用?

我最近和一位同事討論了在PHP中使用自動加載器的問題。他反對我辯護他們。

我的觀點是,自動加載器可以幫助您最大限度地降低手動源依賴性,這反過來可以幫助您減少包含大量可能不需要的大文件時消耗的內存量。

他的迴應是,包含你不需要的文件不是一個大問題,因爲一旦文件被Apache子進程保存在內存中並且這部分內存將可用於後續請求,就會包含這個文件。他認爲,你不應該關心包含文件的數量,因爲它們很快就會全部加載到內存中,並從內存中按需使用。因此,內存不是一個問題,試圖在文件系統上找到所需文件的開銷更爲重要。

他是一個聰明的人,並傾向於知道他在說什麼。但是,我一直認爲Apache和PHP使用的內存是特定於要處理的特定請求的。 爲每個請求分配的內存量等於memory_limit PHP選項,任何源編譯和處理僅對請求的有效期有效。

即使使用像APC這樣的操作碼緩存,我仍然認爲單個請求仍然需要將每個文件加載到內存中,並且APC只是一個快速預先編譯的響應過程。

我一直在尋找一些關於此的文檔,但至今沒有找到任何東西。我真的很感激,如果有人能指出我有關這個話題的任何有用的文件。

UPDATE:

只是爲了澄清,自動裝卸討論部分更多的是情境的:)。

它可能並不清楚,但我的主要問題是關於Apache是​​否會將其資源集中在一起以響應多個請求(特別是包含文件使用的內存),或者每個請求是否需要檢索滿足所需的代碼執行路徑與來自同一進程的其他請求隔離開來。

例如: 文件1,2,3和4是相同大小的每個100KB。 請求A包含文件1,2和3. 請求B包括文件1,2,3和4.

在他看來,他認爲請求A將消耗300KB的全部執行,並且請求B將只有因爲文件1,2和3已經在內存中,因此需要消耗100KB。

在我看來,它是300KB和400KB,因爲它們都是獨立處理(如果通過相同的過程)。

這使他回到了他的論點,「只包括很多'因爲你會使用它',而不是我的'只包括你需要保持請求的大小。

這對於我如何構建一個PHP網站來說是相當基礎的,所以我會熱衷於知道我是否在這裏不受歡迎。

我一直認爲,對於大型網站內存而言,最寶貴的資源和更多的關注點,而不是文件系統檢查可能由內核緩存的自動加載器。

你說得對,現在是基準測試的時候了!

回答

2

你是聰明的忍者,蚱蜢。直到類要求

自動加載磁帶機不裝入類文件。這意味着他們將最多使用與手動包含相同數量的內存,但通常少得多。

類得到讀取文件,即使一個Apache線程可以處理多個請求的每個請求的新鮮,讓你的朋友「eventuall所有人都讀」是站不住腳的。

您可以通過將回聲「富」證明了這一點;在類文件中的類定義之上。無論您是自動加載還是在開始時手動包含整個類文件,您都會在每個新請求中看到該行將被執行。

我無法找到任何這很好簡潔的文檔 - 我會寫一些與某些內存使用的例子 - 因爲我也曾經有過解釋此對他人和展示證據讓它下沉我覺得zend的人們並不認爲任何人都不會看到自動加載的好處。

是的,APC和類似的(像所有的緩存解決方案)可以克服資源消極,甚至可以在性能上獲得小的收益,但是如果你在不重要的數量的庫上做這些,你就會吃掉大量不需要的內存,爲大量客戶提供服務。嘗試一下就像在一個龐大的包含文件中加載一個健康的梨庫庫,同時處理500個連接點擊你的頁面。

即使使用Apc之類的東西,您也可以使用自動加載器與任何非命名空間類(當前大多數現有php代碼)一起使用,因爲它可以幫助避免處理大量類庫時的全局命名空間污染。

4

這裏是你如何贏得參數:跑切合實際基準,是對數字的右側。

我有過這樣的討論,所以我嘗試了一個實驗。使用APC,我嘗試了一個Kohana應用程序,其中包含一個整體包含(包含所有Kohana)以及標準自動加載器。最終的結果是,單個包含在統計上不相關的速率更快(不到1%),但使用了更多的內存(根據PHP的內存功能)。在沒有APC(或XCache等)的情況下運行測試是沒有意義的,所以我沒有打擾。

所以我的結論是繼續使用自動加載,因爲它更易於使用。嘗試與您的應用程序相同的事情,並向您的朋友展示結果。

現在你不需要猜測。

聲明:我沒有使用Apache。我無法強調自己的應用程序在自己的硬件上運行自己的基準測試。不要相信我的經歷會成爲你的。

+0

感謝馬修,我編輯了原文,以防萬一,但我肯定會運行一些測試! – Sirhara 2012-07-13 15:19:11

+0

我不知道mod_php如何處理同一頁面,但如果你使用操作碼緩存,那麼PHP文件本身肯定會在共享內存中。我理解vanilla PHP的方式是,在每次請求時打開,解析和執行文件......所以我不確定內存共享的發生位置。我認爲它仍然歸結爲基準測試...使用'ab'來運行測試。我相信你會看到,不管你使用自動加載是否歸結於個人偏好......我不認爲性能會有顯着不同。 – Matthew 2012-07-13 15:35:10

0

這是我的opionion。

我認爲自動加載機是基於以下原因

  1. 我想知道一個非常糟糕的主意在我的腳本抓住從數據/代碼什麼,。使調試更容易。
  2. 這也有配置問題,因爲如果您的開發人員之一更改文件(升級等)或配置和事情停止工作,它很難找出它被打破。
  3. 我也認爲這是懶惰的編程。

至於內存/性能問題,如果計算機正在爲此苦苦掙扎,那麼爲計算機購買更多的內存同樣便宜。

+1

你能否詳述一下爲什麼你認爲這是懶惰的編程?我很好奇,因爲它似乎足夠有自動裝載機功能。 – Dave 2012-07-13 14:44:35

+1

@Dave - 我認爲懶得不要明確你的腳本是什麼,並依賴解釋器來找到合適的代碼。它還有助於文檔和未來的維護。爲什麼輸入'require'需要很多努力? – 2012-07-13 14:56:55

+0

@因此可以說,所有的事情都是平等的,一個懶惰的程序員總比一直努力工作的人更好 – 2012-07-13 15:21:15