2010-02-14 124 views
0

我正在構建一個小型的PHP/JavaScript應用程序,它將爲美國所有州的所有城市做一些處理。總計(52 x 25583)= 1330316或更少的項目需要處理。可以1330316 AJAX請求崩潰我的服務器?

每個項目的處理過程大概需要2-3秒,所以用戶可能不得不盯着這個頁面1-2小時(或者至少在他做其他事情時保持最小化)。

爲了給用戶最大的回饋,我想通過JavaScript控制頁面的處理,基本上是這樣的:

var current = 1; 
var max = userItems.length; // 1330316 or less 

process(); 

function process() 
{ 
    if (current >= max) 
    { 
    alert('done'); 
    return; 
    } 

    $.post("http://example.com/process", {id: current}, function() 
    { 
     $("#current").html(current); 
     current ++; 
     process(); 
    } 
); 
} 

在HTML我將具有以下狀態消息,其

<div id="progress"> 
    Please wait while items are processed. 
    <span id="current">0</span>/<span id="max">1330316</span> items have been processed. 
</div> 

希望你都可以看到我是多麼希望這工作:每當process()函數被調用將被更新。

我唯一擔心的是,如果這些1330316請求同時發送到服務器,是否有可能會導致服務器崩潰?如果是這樣,如果我在服務器端PHP代碼中使用sleep(3);對每個請求進行了額外的等待,那麼這會讓事情變得更好嗎?

或者是否有不同的機制向用戶顯示快速反饋,如輪詢不需要我與Apache或服務器混淆?

+1

如何更新狀態每(10,100)請求,而不是每個人的更新?這能改善事情嗎? – glasnt

+0

它可以但是然後我會顯示用戶? –

+0

此代碼尚未生效,我只是在執行此操作之前檢查是否存在任何潛在的缺點 –

回答

3

如果你可以在服務器上放置一個cronjob,我相信它會更好。使用cronjob進行實際處理並使用Javascript定期更新狀態(比如說,每10秒鐘一次)怎麼樣?

然後,第一步是觸發cronjob PHP將檢查的一些標誌。如果它處於活動狀態,那麼必須執行任務(您可以使用一些臨時文件來告訴腳本必須處理哪些記錄)。

cronjob會完成這項任務,然後當它的迭代完成時關閉標誌。

這樣,用戶甚至可以關閉應用程序並稍後檢查它,服務器將處理所有處理,不受客戶端活動中斷。

+0

爲了不用crontab方式(這並不總是可行的)我建議讓php處理儘可能在3-5秒內完成儘可能多的操作,然後返回到javascript完成多少處理以及新索引。然而,這不能替代真實的後臺處理,因爲瀏覽器必須保持打開狀態。但它也從服務器中刪除負載。 – hurikhan77

+0

cronjob將不得不運行每秒不會嗎? –

+1

cronjob將作爲工作進程的調度程序。 「每秒」意味着它會在一秒鐘的時間分辨率內對新作品做出反應。我不會這麼做,因爲這沒有意義。 – hurikhan77

1

在你的服務器端PHP腳本中進行睡眠只會讓它變得更糟。它導致更多的進程停滯不前,這會增加並行工作/休眠進程的數量,從而增加內存使用量。

不要擔心這麼多的過程可以並行進行。通常apache服務器被配置爲並行處理不超過150個請求。配置良好的服務器不會並行處理更多的請求,而不是資源可用(好的管理員事先做一些計算)。其他請求必須等待 - 並且由於您的請求數很可能會在處理之前超時。

然而,您的擔心應該是關於客戶端資源,但它看起來像您的腳本只有在以前返回時纔會啓動新的請求。順便說一下:行爲良好的HTTP客戶端(您的瀏覽器應該是這樣)並行地向同一個IP啓動不超過6個請求。

更新:除了上述,你應該認真考慮重新設計你的批量處理方法(類似於@Joel建議) - 但這應該轉到另一個問題。

+0

我決定去克倫工作的方式,但感謝您的回覆:) –