1

我正在開發一個涉及對第三方Web服務的調用的PHP Web應用程序。最近我遇到了問題,因爲一些Web服務速度緩慢和/或超時。 (當發生這種情況時,服務在5-6分鐘後拋出錯誤,這是由Web應用程序處理的)緩慢的服務器腳本會導致IE掛起

但是,問題出現在等待結果/超時時,所有其他連接瀏覽器(IE中的其他窗口/標籤)失速。這似乎是瀏覽器的問題,因爲如果在另一個瀏覽器(例如Chrome)中打開輔助窗口,Web應用程序將毫不拖延地提供頁面。我已經考慮異步設置Web服務調用(一個單獨的server.side進程,或在瀏覽器中的ajax調用),但同時我想知道爲什麼IE瀏覽器將所有連接在等待一個頁面時,Web應用程序處於等待狀態?難道自定義頭文件或其他瑣碎的標記技巧會告訴IE繼續與同一主機上的其他頁面建立連接嗎?

回答

1

問題出現的同時等待結果/超時,在瀏覽器中

所有其它連接到Web應用程序你看到的是正常的和預期的行爲,如果你使用會話。當會話所有者發出請求時,默認的基於文件的會話處理程序會在會話文件上放置一個鎖。一旦請求完成,鎖定被釋放。同時,如果用戶提出任何進一步的請求,這些請求將等待鎖定被釋放,然後才能繼續。此行爲可防止可能會導致會話數據丟失的爭用情況。

如果您不使用會話,或者您已經編寫了自己的會話處理程序,並且它沒有鎖定(大多數不需要,您必須自己編寫該行爲),那麼是的,IE是怪異的,而我沒有進一步的建議。

我已經考慮設置Web服務調用異步

如果Web服務是不可靠的,這是一個好主意。你應該考慮Gearman,一個工作/消息隊列系統。它有comprehensive PHP support作爲PECL extension

+0

即使對於不使用會話的人,他們也必須驗證php.ini中的session.auto_start設置爲0,因爲他們可能在不知道它的情況下使用會話。 – 2010-07-30 11:38:22

+0

非常感謝您的信息!我確實使用會話,並且從未發生過鎖定發生在服務器上的情況,因爲1)所有其他操作執行得非常快2)大多數操作都是單頁 – goorj 2010-08-04 11:11:17