2011-03-20 90 views
1

在執行兩個非常簡單的ajax POST請求(成功)時,Apache服務器似乎總是按照請求的順序響應,儘管第二個請求需要比第一個請求少得多的處理時間。雙核心PC上的Apache/2.2.6(Win32)和多線程

服務器處理Request1所用的時間爲30秒。 服務器處理Request2所用的時間爲10秒。

 var deferred1 = dojo.xhrPost(xhrArgs1); 
     var deferred2 = dojo.xhrPost(xhrArgs2); 

我希望Apache在我的雙核心機器上實現一些「並行化」,這顯然不會發生。

當我在一個單獨的瀏覽器中同時執行每個請求,然後工作正常,首先返回Request2。

事實:

  1. httpd.conf中已:ThreadsPerChild的50,50 MaxRequestsPerChild
  2. PHP版本:5.2.5
  3. ,這兩個客戶端請求在收到大約在同一時間Apache的訪問日誌的狀態,這是預期的。在服務器端
  4. PHP代碼是睡眠(30)/睡眠(10)

爲什麼我在同一個瀏覽器中運行時不會獲得「並行」知不知道這樣簡單的事情?

感謝

+0

是的,我做的。也是Zend框架。 – 2011-03-20 12:06:29

+0

對不起,我在你回答了:-(重新發布它,以便您的評論是不是斷章取義的確切同時刪除了我的意見:如果你使用的會議我問 – 2011-03-20 12:08:53

+0

FWIW,只是想指出兩件事情,你可能不知道關於兩行JS的你貼。(1)'dojo.xhrPost'不是構造函數,所以你不應該使用'new'關鍵字之前。(2)這兩個請求將因爲XHR在默認情況下是異步的 – 2011-03-21 04:05:14

回答

1

當你的兩個請求來自同一瀏覽器發送的,他們都共享同一個會議

當會話存儲在文件中(這是默認),有是所使用,以確保在同一時間兩個腳本不會使用同一個會話鎖定mecanism - 允許,可能會導致第一個腳本的會話數據被第二個腳本覆蓋。

這就是爲什麼第一個完成之前,你的第二個腳本不啓動:它等待鎖(由第一腳本創建)的會話數據被釋放。


欲瞭解更多信息,看一看的session_write_close()手冊頁 - 這可能是你的問題的解決方案:

會話數據:sleep()(報價)之前關閉會話通常存儲後 腳本終止而不 需要調用session_write_close(), 但會話數據被鎖定 防止併發寫入只有一個 腳本可以在任何 時間的會話上操作。
當將框架集 與會話一起使用時,您將通過 體驗由於此鎖定而加載的框架之一 。
您可以 降低儘快 所有更改會話變量 完成結束會話加載所有 幀所需的時間。

+0

嗨帕斯卡,它完美的工作。非常感謝 – 2011-03-20 12:20:17

+0

不客氣: -) 玩的開心 ! – 2011-03-20 12:21:08

0

瀏覽器通常對同一站點有兩個連接的限制(儘管您可能會在某些瀏覽器中增加此限制)。有些瀏覽器會保留一個用於下載圖片等內容的連接,另一個連接用於XHR。這意味着您的兩個XHR電話實際上會以相同的連接一個接一個地進行。

您的瀏覽器將在每次調用XHR後立即返回,因爲它們是異步的,但內部很可能只是批了請求。

當你在兩個不同的瀏覽器中運行,顯然他們每個人都有兩個連接,所以這兩個XHR請求在不同的連接出去。這裏沒問題。

現在,它依賴於瀏覽器。如果瀏覽器允許您使用XHR呼叫佔用兩個連接,那麼您最多可以同時運行兩個請求。然後它將由服務器決定哪一個先做。

在任何情況下,如果用(或任意數量> 2)同時XHR請求嘗試,你不會獲得超過2在同一時間上的現代瀏覽器在服務器上執行。