2013-02-20 34 views
6

您好,我的問題是數據流如何在Apache Web服務器+ PHP中正常工作。apache php>用戶請求

當用戶訪問網址:然後本地主機/ index.php的和在當另一個用戶訪問同一個URL我想請求是執行逐個(不是多線程)相同的時間和所述第一用戶得到響應另一個。

問題是:如果第一個請求以某種方式長時間停留在1分鐘內,其他用戶應該等待第一個請求完成,然後完成它們的請求以獲得Apache Web服務器+ PHP的響應。如果答案是肯定的(其他用戶應該在隊列中等待):我們可以提出並行執行請求(多線程)以防止排隊等待

+0

Apache有幾種多線程模型可供選擇,PHP有幾種可用的SAPI。實際上,從編碼的角度來看,這並不重要。 – 2013-02-20 10:54:04

回答

9

雖然PHP可能是單線程的,但Apache可以運行多線程進程和多線程。這允許許多請求被同時執行。實際上,您可以配置多少個同時發生的請求。

您實際上可以看到Apache服務於這些請求,查看哪些正在等待以及哪些正在通過mod_status(http://httpd.apache.org/docs/2.2/mod/mod_status.html)提供服務。

+1

如何調用相同的腳本來執行並且首先請求凍結多於1分鐘? – 2013-02-20 11:11:49

+0

你是指兩個不同的用戶?在那種情況下,是的。 Apache將同時爲衆多用戶提供服務。你可以認爲許多Apache服務器都獨立工作,並且不關心別人在做什麼,即使它只是一個Apache的安裝。 – 2013-02-20 11:23:24

+2

我有一個腳本運行8小時後,我從瀏覽器調用它,但是當我嘗試從另一個瀏覽器選項卡打開一些其他腳本我只得到加載像等待響應(鉻問題應該是),但如果我從另一個瀏覽器打開(ie9 )我可以儘快得到答案,這證明apache是​​多線程的。 – 2013-02-20 11:31:51

2

Apache有多個線程,所以多個PHP腳本可以一次運行。

Nginx等Web服務器使用事件驅動架構。異步I/O和所有爵士樂。

Web服務器通常具有某種機制來使他們一次處理多個請求,或者至少使其看起來可以。

Apache使用線程,Nginx使用事件循環,但它們不是你想要的串行。原因很簡單:浪費資源。雖然你的PHP腳本正在等待硬盤移動到正確的位置,所以你可以從你正在閱讀的文件中讀取一個塊,你可能還在做其他事情,比如說。處理另一個不需要I/O的請求。

如果某個請求在其他用戶發出請求之前完成至關重要,則應考慮切換到更加分離的異步架構。我不知道你在當前的解決方案中投入了多少。事件處理可以像簡單的民意調查或甚至long poll一樣簡單地實現。

+1

正如我從你的答案可以理解的apache是​​多線程的,並在理論上同時執行並行請求。但如果調用相同的腳本執行並且首先請求凍結多於1分鐘,那麼該怎麼辦?第二個請求會在同一時間執行還是等待完成第一個請求? – 2013-02-20 11:10:49