2011-06-13 41 views
2

我看到大多數答案認爲mod_php效率不高,因爲由於提供靜態文件(如this one),內存佔用量會更高。爲什麼mod_php比fastcgi效率低(php-fpm)

但我有不同的意見如下:

由於事實上,代碼節中fork() ED進程共享,所以內存佔用斷言不應該持有。

我能想到的唯一原因是mod_php是非線程安全的,因此web服務器只能爲每個請求創建子進程。

雖然在fastcgi模式下web服務器可以通過複用技巧提升性能,從而減少了開銷。

總之,mod_php的的缺點是不是它的內存佔用,但fork()的開銷,但如果mod_php可以thread_safe,fork()不會是必要的,這將是最有效的解決方案來服務請求。

以上是我的看法,但不是100%確定。

是嗎?

回答

2

分叉是相當快的,默認的apache + mod_php安裝也是分叉的。 (除非使用工人mpm)。

真正的原因是(種)如下:

標準mod_php,並且將有相當大的過程,因爲這個過程包含包含PHP和其他所有的Apache模塊等如果 PHP是在單獨的過程中,PHP過程可以有更短的生命週期,並且在完成PHP時快速將結果傳回給Apache。

另一個原因(正如你所提到的)是PHP不會觸及非php請求。

使用FastCGI時,您可以切換到工作人員mpm的事實只是獎金;但確實增加了效率。

一般來說,對於這些類型的設計,您總是希望儘可能使apache和php進程儘可能短,並且將它們分割開來有所幫助。

但是是.. 分叉速度非常快,而且在某些設計中,它們實際上可以比Linux上的線程(沒有源代碼,我只記得閱讀本文)更好地運行。對於網絡服務器類型的系統,我確實相信基於反應器模式的系統工作得更好。 NGinx和Varnish就是這方面的主要例子。

+2

我認爲Apache和PHP在mod_php中處於相同的進程,而不是單獨的進程。 – 2011-06-13 14:00:23

+0

對不起,這是更糟糕的措辭問題..修復該段。 – Evert 2011-06-13 14:12:51

+0

但我仍然不認爲這是原因,因爲在mod_php和fastcgi模式下,php和apache模塊總是在內存中,唯一的區別是juat他們在不同的進程中。也就是說,在fastcgi模式下,php工作進程也是持久的,而不是更短的一生。同樣,內存佔用不是問題。 – 2011-06-13 14:20:23