2008-12-08 180 views
1

我會直截了當!AJAX,PHP會話和同步請求

當用戶提交他們的搜索時,我的JavaScript發送了大約20個AJAX請求到我的PHP文件以響應(通過外部Web API)。結果存儲在會話數組中的數組中。

我讀過,瀏覽器將只允許2個同時請求到服務器。

我的第一個問題是,雖然仍有多個請求仍在等待響應,但AJAX「添加到購物籃」請求將不起作用,因爲它仍在等待其他請求完成。

我的第二個(和更惱人的)問題是,正在同時處理2個請求似乎在寫對方,這樣,當所有的反應是完整的只有一半是會話陣列英寸無論是所有奇數還是偶數,取決於最終請求是奇數還是偶數。

我不希望單獨發送請求(即只有在最後一次完成時才發送下一個請求),因爲這樣會使用戶放慢速度。

有沒有解決這個會話覆蓋或者我應該完全使用完全不同的方法?

謝謝大家!


編輯:
這是檢查域的可用性。用戶搜索「mydomain」,com,net,org等結果最終呈現。

發送一個請求並讓腳本一次搜索所有的tld意味着一個響應不會被返回,直到所有的結果都進入。某些tld的結果似乎需要超過30秒,在此期間用戶沒有得到任何反饋,除了一個歪曲的圖標和「Please Wait」(這是javascript未啓用時發生的情況)。

獨立請求允許我爲他們在顯示領域的可用性。

目前我一起發送一個請求的思路思考,然後使用JavaScript的setInterval的反覆檢查會話,直到所有的結果是。

+0

我覺得我不能評論這個,除非你解釋爲什麼你需要20個AJAX調用每個搜索請求。 – mepcotterell 2008-12-08 12:40:45

+0

你真的需要搜索會話嗎? – 2013-04-13 00:36:18

回答

1

請求被並聯,這意味着這是類似於併發編程(帶螺紋),包括競爭條件等

我的建議是隻發送搜索動作(假定用戶僅執行一次搜索處理,而不是20)到服務器,sp在你想要它執行的20個動作中點燃它。這可以讓你依次執行它們,防止它們互相覆蓋。

0

對不起,它不是你真正的答案,但20個請求聽起來像一個單一的搜索太多。實施了類似的東西,即。存儲在會話中的簡短搜索歷史記錄我們選擇不使用AJAX。有一段時間和一個地方,但是如果它會在你的流量增加的時候通過請求來殺死你的服務器,那就不是了。

4

我想你應該開始重構你的解決方案:

  1. 所有性能準則規定,你應該儘量減少HTTP請求的數量。20實在是太多了
  2. 如果你有一個共享的資源,你需要鎖定解鎖你操縱它的部件,以防止兩個或更多的請求,同時更新
0

嘗試建立一個請求隊列爲您阿賈克斯電話。每次電話會在上一次電話結束後進行。

第二次請求發出後,您不能確定會發生什麼,因爲如您所說,只能發送2個同步請求。該數字第三請求將最有可能取代2號等

0

我認爲這是某種自動完成的搜索框。如果您使用的是Scriptaulous'Ajax.Autocompleter,則可以簡單地指定一個「minChars」參數。它不會發送AJAX請求,直到至少輸入很多字符爲止。

您還可以調整'頻率'參數,該參數會更改輸入字段在更改之前應該輪詢的頻率(以秒爲單位)發射一個AJAX請求。

More details here

0

正如其他人所指出的第一個方法應該是減少請求的數目。如果這不是一個選項,您可以使用子域來增加並行請求的數量。

配置您的DNS(用於說mydomain.com)接受所有子域* .mydomain.com並將它們發送到同一臺服務器。

你就可以發送不同的AJAX請求

這種方法使用mapservers如谷歌地圖,以增加不同的域(a.mydomain.com,b.mydomain.com,...)瀏覽器並行下載的地圖數量。

0

問題是,在同時請求之間,會話啓動。即使它在另一個上下文中打開,由於存儲的會話讀取和相同的cookie,每個請求打開的會話也是相同的。然後,如果其中一個當前請求首先結束其任務,它將關閉會話,因爲它總是在腳本結束其任務時發生,但由於另一個腳本(另一個被調用)可能仍在運行,它不知道該會話已經關閉,所以有一些解決方案。 在結束任務之前,將會話var複製到sessionholder var,重新啓動會話,還原seesion值session = sessionholder和session_write_close 哪個會話將首先開始或結束?有時候沒有辦法知道,也許第一個開始會話將花費更長的時間來結束他的任務,而另一個來來去去,無論如何,照原樣,會話只不過是保存一個名爲session的變量,類型包含鍵值的數組,處理恢復存儲的值,然後在腳本任務結束時更新這些值的保存,這是會話在這個問題上是自動的,所以如果您啓動一個會話沒有區別(恢復其存儲的值,給它分配新的值,然後再保存它們,這個過程是開始會話,分配值,會話寫入關閉。當然,請注意,如果你重新啓動一個會話而沒有保存它的實際值,它們將會丟失他們存在),所以這就是爲什麼你必須首先保持其實際值,恢復,重新分配當前值,然後writeclose。PHP所特有的會話變量固有的另一個過程是分配一個引用(會話ID),它將它發送給客戶端(通常通過cookie),因此當cookie返回時,該引用ID標識存儲的會話變量以恢復以前的值。 請記住,一個相同的調用可能會做同樣的事情,因爲ajax是異步的,如果由於某種原因一個調用延遲,並且用戶再次點擊,新的請求將不會結束當前並且會發生同樣的問題,所以如果使用ajax根據您的應用程序準備處理會話。 最後,請記住,調用可能是不同的文件,或相同的文件,一個ajax調用請求prices.php其他products.php但兩個會使用相同的會話存儲變量,會話var只有一個所有時間爲你所有的腳本。 Avenida Gez。 感謝您的閱讀