你能告訴我服務器一次處理不同的http請求的方式嗎?如果10個用戶登錄一個網站並同時發送一個頁面請求會發生什麼?服務器如何管理不同用戶的請求?
回答
通常,每個用戶都會爲該頁面發送HTTP請求。服務器接收請求並將它們委派給不同的工作者(進程或線程)。
根據給定的URL,服務器讀取文件並將其發回給用戶。如果該文件是一個動態文件(如PHP文件),則該文件在發回給用戶之前執行。
一旦請求的文件被髮回,服務器通常會在幾秒鐘後關閉連接。
阿帕奇2具有兩種不同的操作模式。一個是作爲threaded server運行,另一個使用稱爲「prefork」(multiple processes)的模式。
這些請求將被同時處理,以達到HTTP守護進程的最佳能力。
通常,HTTP守護程序會產生幾個進程或幾個線程,每個線程將處理一個客戶端請求。服務器可以保留備用線程/進程,以便當客戶端發出請求時,不必等待創建線程/進程。每個線程/進程可以映射到不同的處理器或內核,以便可以更快地處理它們。然而,在大多數情況下,網絡I/O的要求是網絡I/O,而不是缺乏原始計算,所以通常不會因處理器/內核的數量大大低於一次處理的請求數而放慢速度。
HTTP使用TCP這是一個基於連接的協議。也就是說,客戶端在與服務器通信時建立TCP連接。
允許多個客戶端同時連接到同一目標機器上的同一個目標端口。服務器只是打開多個同時連接。
Apache(和大多數其他HTTP服務器)有一個多處理模塊(MPM)。這是負責分配Apache線程/進程來處理連接。這些進程或線程可以在自己的連接上並行運行,而不會彼此阻塞。即使在沒有連接打開的情況下,Apache的MPM也傾向於保留「備用」線程或進程,這有助於加速後續請求。
隨Apache附帶的程序ab(ApacheBench的簡稱)可讓您測試在您一次打開多個連接到HTTP服務器時發生的情況。
Apache的配置文件通常會設置它將接受的同時連接數的限制。這將被設置爲一個合理的數字,這樣在正常操作期間不應該達到這個限制。
還要注意,HTTP協議(從版本1.1開始)允許保持連接打開,以便客戶端在關閉連接之前可以發出多個HTTP請求,這可能會減少他們需要進行的同時連接的數量。
更多關於Apache的MPM中:
阿帕奇本身可以使用許多不同的多處理模塊(MPM的)。 Apache 1.x通常使用一個名爲「prefork」的模塊,它預先創建了許多Apache進程,以便傳入連接通常可以發送到現有進程。這正如我上面所述。
Apache 2.x通常使用名爲「worker」的MPM,它使用multithreading(在單個進程中運行多個執行線程)來實現相同的目的。多線程優於單獨的進程的原因在於,與打開單獨的進程相比,線程更輕量化,甚至可能使用更少的內存。速度非常快。
多線程的缺點是你不能運行諸如mod_php之類的東西。當你多線程時,你所有的插件庫都需要「線程安全」 - 也就是說,他們需要知道在多線程環境中運行。編寫多線程應用程序很困難。因爲進程內的線程在它們之間共享一些內存/資源,所以當另一個線程正在寫入線程時,這可能很容易在線程讀取或寫入內存時創建競爭狀態錯誤。解決這個問題需要技術,如locking。許多PHP的內置庫不是線程安全的,所以那些希望使用mod_php的用戶不能使用Apache的「worker」MPM。
服務器(apache)是多線程,這意味着它可以一次運行多個程序。幾年前,一個CPU可以在多個線程之間快速來回切換,從而表現出兩件事情同時發生。現在,計算機有多個處理器,因此計算機可以同時運行兩個代碼。話雖如此,線程並沒有真正以任何簡單的方式映射到處理器。
有了這種能力,PHP程序可以被認爲是一個單一的執行線程。如果兩個請求同時到達服務器,則可以使用兩個線程同時處理請求。他們可能會得到大約相同數量的CPU,因此如果他們做同樣的事情,他們將在大約同一時間完成。
多線程最常見的問題之一是「競爭條件」 - 您的兩個請求正在做同樣的事情(「競賽」做同樣的事情),如果它是一個單一的資源,其中之一他們將贏得勝利。如果他們都在數據庫中插入記錄,他們不能同時獲得相同的ID--他們中的一個將獲勝。所以在編寫代碼的時候需要小心,以便同時實現其他請求,並且可以修改數據庫,寫入文件或更改全局變量。
這就是說,編程模型允許你大多忽略這種複雜性。
- 1. 如何使用Java HTTPS服務器管理HTTP請求?
- 2. 如何從服務器識別處理請求的用戶
- 3. Spring WebApp如何管理不同客戶的請求?
- 4. 如何檢查來自同一服務器或不同服務器的請求?
- 5. 在此服務器上找不到請求的URL /管理
- 6. 保持客戶端與服務器端同步 - 狀態管理和http請求
- 7. 如何使用JavaScript從不同的服務器URL請求
- 8. Web服務器如何管理其線程池以服務併發請求
- 9. 如何使用consul管理不同類型的服務器
- 10. 如何用單臺服務器管理不同的環境?
- 11. .NET Web服務 - 管理web請求
- 12. 如何使用Go將不同域的請求複用到不同服務器?
- 13. 請求LDAP的問題:服務器不願意處理請求
- 14. LuaSocket服務器如何同時處理多個請求?
- 15. 如何訪問IIS服務器管理器中的請求監視器?
- 16. 如何驗證對Windows Azure的管理服務請求?
- 17. 同步ajax請求管理器
- 18. 服務器到服務器請求沒有服務帳戶
- 19. 不完全理解如何執行請求谷歌服務器與python請求
- 20. 客戶端請求服務器使用服務器IP地址
- 21. 如何查看來自服務器的用戶請求?
- 22. 如何將不同的子域請求重定向到不同的服務器
- 23. 使用nginx將請求代理到兩個不同的服務?
- 24. 如何管理POST請求
- 25. 如何管理專用服務器
- 26. SOLR - 如何管理髮送到solr服務器的請求數量
- 27. Modularize用戶管理服務器,社交供稿服務器
- 28. 如何使用SOAP的Web服務發送HTTPS同步請求到服務器
- 29. 如何同步調用google方向API以請求服務器端的服務?
- 30. 如何管理多個服務器上的用戶會話?