2010-06-07 28 views
11

我試圖建立從Silverlight應用程序到Apache頁面(即,不爲每個HTTP請求創建新的TCP連接)由Apache服務器託管的HTTP持久連接。服務器響應中的「連接:保持活動」

爲此,我需要Web服務器發送其HTTP響應,並將「Connection」頭設置爲「Keep-alive」。客戶端,似乎沒有任何問題,因爲Silverlight提供的網絡API基本上是瀏覽器網絡功能的一個包裝,從我讀過的內容來看:如果瀏覽器支持HTTP 1.1和Connection:Keep-Alive默認情況下,它的請求,沒關係。內容長度也很好定義,以便服務器知道何時必須發送響應。但是,服務器對PHP請求的響應系統地將「Connection:」設置爲「close」,從而結束連接並阻止持續連接。

我試過一些東西來解決這個問題:不同的方法(GET和POST),在我的腳本的開頭,明確給出了一個「連接:保持活動」的響應以下PHP代碼:

header("Connection: Keep-alive"); 

後者將預期的標題添加到響應中,這很好,但附加語句「Connection:close」仍然附加在響應標題中。

它是強制「關閉」(出於某種安全或性能目的,我猜測)的PHP或Apache的功能,還是我只是在這裏失去了一些東西?

在此先感謝。

P.S. :通過嗅探數據包,我注意到沒有多少網站使用「Keep-alive」並且TCP連接重新建立。 Keepalive是HTTP 1.1下的默認和首選行爲嗎?

+0

這可能阿帕奇,而不是PHP - 給我所知,PHP擁有沒有控制權。您可以通過嘗試通過相同的連接請求靜態文件進行驗證。 Apache指令:http://httpd.apache.org/docs/2.2/mod/core.html#keepalive – 2010-06-07 16:45:17

回答

24

Keep-Alive功能不適用於持續連接。

Keep-Alive旨在減少網站的連接數量。不要爲網頁中的每個圖像/ css/javascript創建新的連接,而是會重複使用相同的連接。

在Apache中也有一些設置可以阻止這種情況發生,如連接請求的最大數量或請求之間的超時。這也會讓你的資源非常快,因爲每個連接都需要它自己的線程。

您應該切換到另一種解決方案,即針對這種工作。

對於保持你的連接打開,你可以在http://orbited.orghttp://twistedmatrix.com/trac/

+1

+1不會濫用HTTP進行持久連接。如果需要,讓PHP守護進程監聽端口/套接字是很容易的。 – Wrikken 2010-06-07 17:06:19

+0

是的,這也是一種可能性。在我的opionion軌道可以做的更容易,更穩定,同時還提供一個基本的http服務器:) – favo 2010-06-07 17:08:44

+0

我正在編程一個實時即時消息應用程序(有點像在實時方面的谷歌波)有限的情況下(僅PHP和最小的Web服務器功能)。我甚至不允許使用日期庫。在這種壓力請求(每次擊鍵基本上產生請求)時,保持與服務器的連接將是有用的。謝謝你的建議。 – ZenithM 2010-06-07 19:06:14

5

看一看由於PHP不管理HTTP連接服務,它沒有辦法改變這個設置。你需要在服務器中設置它。例如,你可以,如果你正在使用mod_php,並且能夠保持存活像這樣在Apache中,

KeepAlive On 
+0

謝謝,這個參數的確似乎在我的服務器上設置爲關閉。 – ZenithM 2010-06-08 16:06:32