2010-03-13 133 views
1

美好的一天!整個網站在一個頁面正在等待阻止操作時被阻止(PHP,ASP.NET)。爲什麼?

我發現了LAMP堆棧和ASP.NET的有趣行爲。

場景:

有一個在2-3分鐘內執行任務頁面(使HttpWebRequest的用於ASP.NET和捲曲的PHP)。處理該頁面時,不會處理來自同一瀏覽器的對該虛擬主機的所有其他請求(即使我在一臺機器上使用不同的瀏覽器)。我使用兩個用PHP和C#編寫的頁面。

我已經在Windows和Debian上使用Apache + PHP在mod_php和fast_cgi模式下進行了測試。 對於ASP.NET,我使用集成模式下的IIS6(帶有專用應用程序池和默認應用程序池)和IIS7。

我知道最好是使用異步調用這樣的事情,但我只是好奇爲什麼單個頁面阻止整個站點,而不僅僅是處理請求的線程?

在此先感謝!

回答

1

看來你打開標準的php會話,直到請求結束纔打開。這意味着會話文件被鎖定。如果您不需要會話數據,請儘快使用session_write_close()。

+0

是的你是對的,通過'session_write_close()'解決了這個問題,我忘了在這裏發佈解決方案。謝謝! – artvolk 2011-12-13 14:31:39

0

我不認爲它是封鎖網站;我懷疑開放連接會阻止客戶端發出更多請求。您是否證明其他機器在長時間運行的請求正在進行時無法使用該站點?

+0

我已經試圖從同一臺機器上使用其他瀏覽器(不是另一個窗口,另一個程序)。據我瞭解,這應該爲新請求創建另一個處理線程。 – artvolk 2010-03-14 10:23:07

+0

除非您的本地計算機已連接到同一端口上的同一服務器,否則不會。我重複我的問題:你證明了*其他機器*不能使用該網站嗎?我認爲你沒有證明服務器被阻止。 – 2010-03-14 11:43:55

+0

我已經從站在附近的其他PC進行測試。當我的網頁執行HttpWebRequest時,該網站也被屏蔽了。 兩臺計算機都落後於同一個NAT盒 – artvolk 2010-03-14 12:57:06

0

如果你只看到一個請求來到應用程序,我能想到的唯一的事情就是管道中某處的全局鎖。

該鎖可以是顯式的(您編寫鎖語句)或隱式的。如果您可以看到多個請求 - 這可能是由於線程池耗盡。

請記住,除了用於處理傳入Web請求的線程數量上限之外,還會通過HttpWebRequest單獨限制同時傳出的Web請求的數量,默認情況下此限制非常低 - 如果我記住每個CPU正確2個。我不記得web.config中設置的名稱,但會嘗試查找它。

在任何情況下發布的代碼將會給我們一個更好的機會,以幫助您

+0

謝謝你的迴應,你的意思是這樣的: http://support.microsoft.com/kb/821268 關於PHP和Apache 可是什麼?爲什麼相同的行爲?.. – artvolk 2010-03-14 10:26:49

0

在調試ASP.NET應用程序,我肯定注意到了這個問題,但我一直只是認爲這是一個調試配置問題。你是否在釋放模式下構建了所有東西,並且在web.config中關閉了調試功能?

+0

是的,我有調試關閉。 – artvolk 2010-03-14 10:22:00