給出一些上下文: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網站來說是相當基礎的,所以我會熱衷於知道我是否在這裏不受歡迎。
我一直認爲,對於大型網站內存而言,最寶貴的資源和更多的關注點,而不是文件系統檢查可能由內核緩存的自動加載器。
你說得對,現在是基準測試的時候了!
感謝馬修,我編輯了原文,以防萬一,但我肯定會運行一些測試! – Sirhara 2012-07-13 15:19:11
我不知道mod_php如何處理同一頁面,但如果你使用操作碼緩存,那麼PHP文件本身肯定會在共享內存中。我理解vanilla PHP的方式是,在每次請求時打開,解析和執行文件......所以我不確定內存共享的發生位置。我認爲它仍然歸結爲基準測試...使用'ab'來運行測試。我相信你會看到,不管你使用自動加載是否歸結於個人偏好......我不認爲性能會有顯着不同。 – Matthew 2012-07-13 15:35:10