2010-06-03 77 views

回答

6

通常,每個用戶都會爲該頁面發送HTTP請求。服務器接收請求並將它們委派給不同的工作者(進程或線程)。

根據給定的URL,服務器讀取文件並將其發回給用戶。如果該文件是一個動態文件(如PHP文件),則該文件在發回給用戶之前執行。

一旦請求的文件被髮回,服務器通常會在幾秒鐘後關閉連接。

更多見:HowStuffWorks Web Servers

0

這些請求將被同時處理,以達到HTTP守護進程的最佳能力。

通常,HTTP守護程序會產生幾個進程或幾個線程,每個線程將處理一個客戶端請求。服務器可以保留備用線程/進程,以便當客戶端發出請求時,不必等待創建線程/進程。每個線程/進程可以映射到不同的處理器或內核,以便可以更快地處理它們。然而,在大多數情況下,網絡I/O的要求是網絡I/O,而不是缺乏原始計算,所以通常不會因處理器/內核的數量大大低於一次處理的請求數而放慢速度。

2

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。

0

服務器(apache)是多線程,這意味着它可以一次運行多個程序。幾年前,一個CPU可以在多個線程之間快速來回切換,從而表現出兩件事情同時發生。現在,計算機有多個處理器,因此計算機可以同時運行兩個代碼。話雖如此,線程並沒有真正以任何簡單的方式映射到處理器。

有了這種能力,PHP程序可以被認爲是一個單一的執行線程。如果兩個請求同時到達服務器,則可以使用兩個線程同時處理請求。他們可能會得到大約相同數量的CPU,因此如果他們做同樣的事情,他們將在大約同一時間完成。

多線程最常見的問題之一是「競爭條件」 - 您的兩個請求正在做同樣的事情(「競賽」做同樣的事情),如果它是一個單一的資源,其中之一他們將贏得勝利。如果他們都在數據庫中插入記錄,他們不能同時獲得相同的ID--他們中的一個將獲勝。所以在編寫代碼的時候需要小心,以便同時實現其他請求,並且可以修改數據庫,寫入文件或更改全局變量。

這就是說,編程模型允許你大多忽略這種複雜性。

相關問題