2010-04-20 151 views
2

在我看來,一個網絡應用程序不斷運行;因此,我對文檔頁面感到困惑,這些頁面談論PHP腳本的「結尾」(例如this one)。這樣的引用似乎指的是每個Web請求的結束,但是如果腳本在那裏結束,並不意味着操作系統必須爲每個請求設置一個全新的進程?這看起來不太可能,因爲旋轉一個全新的流程是昂貴的,並且整個網站的效率非常低。PHP腳本何時結束?

+2

是的。服務器比你想象的要快得多。 PHP二進制文件保存在內存中,除非它是一個CGI,然後在每個請求中加載一個完整的php進程。 – 2010-04-20 23:27:41

回答

6

這裏有一個區別:PHP不是一個Web服務器。因此,PHP腳本的結尾與Web服務器的實際結束(或至少大部分時間)無關。

連續運行的Web服務器軟件(如IIS,Apache或Lighttpd)可以執行PHP腳本而不會自行結束。這些腳本,在末尾停止運行。 Web服務器如何爲腳本設置執行環境取決於採取的方法。例如,Apache 2確實可以爲每個Web請求產生一個子進程,儘管它每次都不會再設置整個Web服務器:有一個主進程命令子進程執行設置和參數。

因此,PHP腳本在Web請求結束時結束;也就是說,當腳本到達一條使其停止的語句(如致命錯誤,exit語句等)或到達腳本源的實際結尾時。


編輯關於產卵的新要求新過程的效率。

如今,服務器不會爲PHP本身產生一個單獨的進程:它們使用PHP庫來嵌入語言並使用它。但是,服務器確實可以爲每個接收到的HTTP請求生成一個進程。 Apache使用它的mpm_prefork模塊。

雖然產生一個新的進程的確是昂貴的,它比腳本本身的成本,這可能要持續10分之,這是很多,不僅僅是產卵過程更加的時候可能什麼都沒有。

此外,服務器通常必須一次爲多個客戶端服務;因此,按順序處理每個請求是不可想象的。它們必須同時運行,並且實現者有兩個選擇:線程或進程。 PHP在許多平臺上都不是線程安全的,通常最好是在單獨的進程中運行它。

+0

與打印類似:您的輸出超出了其創建者。 – dawg 2010-04-20 23:17:12

+0

ASP.NET本身也不是一個Web服務器。儘管如此,它仍在不斷運行。 – zerkms 2010-04-20 23:17:35

+0

@zerkms:是的,我知道。 – zneak 2010-04-20 23:25:03

3

是的,這是實際發生的事情,每個請求。這是PHP的本質。