2012-09-04 85 views
2

我有一個運行報表的PHP應用程序,並在90秒內向SQL服務器發出大約100萬次SQL查詢。在這段時間內,沒有其他人可以使用這個基於網絡的應用程序 - 蛋計時器正在滾動,但是直到報告超時或完成纔會加載。我在一個孤立的環境中測試了這個問題,只有我自己在那裏,在瀏覽器中運行報告,然後從其他瀏覽器窗口到此應用程序站點的任何操作都被掛起。php併發請求被卡住了?

對測試環境的一些細節:在IIS

Windows 2008 R2 x64 - IIS 7.5 - PHP 5.3.8 via FastCGI 
Windows 2008 R2 x64 - SQL Server 2008 R2 x64 

FastCGI的設置:

Instance MaxRequests = 200 
Max Instances = 16 
Activity Timeout = 70 
Idle Timeout = 300 
Queue Length = 1000 
Rapid Fails PerMin = 10 
Request Timeout = 90 

每個SQL請求完成小於60毫秒的SQL服務器端。 Web服務器和SQL服務器的CPU負載均小於10%。運行報告時,Web服務器有16GB RAM和大約60%的RAM可用。

看來,PHP一直髮射了太多要求,SQL服務器,成爲太忙,無法處理其他請求。如果是這種情況,那麼應該有一些我可以調整來讓PHP處理更多的併發請求。

有誰知道嗎?請幫忙!

+0

會話鎖定? –

+2

出於好奇,您是否嘗試過通過完全不同的瀏覽器訪問網站(例如,使用Firefox for one和Chrome for another)。只是試圖排除這個想法,也許這只是你的會議被鎖定,而不是整個網站。使用不同的瀏覽器會導致創建多個會話。同一瀏覽器中的不同標籤會共享同一個會話。 –

+0

查看[this](http://stackoverflow.com/questions/12070345/php-multiple-ajax-requests-first-request-block-second-request/12070517)問題。可能你有同樣的問題 –

回答

4

我就刺在黑暗這裏假設它是由於會話鎖定。

當您使用PHP附帶的標準會話處理程序時,它會確保在整個腳本執行過程中(除非session_write_close()之前調用過)使用(建議性)寫入鎖定才能破壞會話文件。

試圖訪問同一會話的其他腳本(你的瀏覽器會通過相同的cookie值)將等待鎖得到釋放,只要需要。

你可以用兩種完全不同的瀏覽器來模擬兩個用戶(一個運行報告,其他訪問站點)進行驗證。如果這有效,你很確定這是由於會話鎖定。

這不應該是一個問題,因爲你知道,當你運行報表,但如果這會引起問題,但是你可以考慮兩件事情:

  1. 沒有啓動一個會話報告腳本(不過這也意味着未經授權的用戶可以嘗試運行報告腳本)
  2. 您繁重的工作開始前關閉會話,使用session_write_close()您已經驗證用戶的身份之後。
+0

非常感謝您的建議,但用戶如何獲得會話鎖?他們中的大多數都通過網絡代理從他們自己的本地PC連接到網站。我問其中一個用戶從他的PC上運行這個報告來複制問題,然後登錄到IIS服務器,但仍然遇到同樣的問題,直到報告超時...我們都使用IE 8瀏覽器。 – user1646590

+0

我不確定爲什麼會發生這種情況,特別是因爲您做了一個測試來驗證它是否與兩個不同的瀏覽器一起工作......不知道代理服務器有什麼頑皮的東西,但它不應該發送自己的cookie。 –

+0

問題的根源可能不同於此。無論如何非常感謝幫助。 – user1646590