2013-01-05 29 views
2

我有這個下面的代碼:兩個Ajax調用不能同時工作(Heroku的)

$(window).load(function() 
{ 
    $('#content1').load('database.php'); 
    setInterval (function() 
    { 
     $.post('status.php', { id: '1'}, function(responseText, responseStatus) 
     { 
      $('#content2').html(responseText); 
     }); 
    }, 5000); 
}); 

基本上,我打電話的database.php中做一些數據庫插入,並用週期性間隔獲得的地位其進展。問題是在插入期間,間隔帖子給我請求超時錯誤。只有在database.php處理完成後,纔會寫入content2中的文本。

現在,我在status.php文件中使用了非常簡單的代碼,只是爲了查看在處理database.php時是否可以得到響應。這裏是代碼(非常簡單):

<?php 
    echo "hello"; 
?> 

我不知道爲什麼我得到超時錯誤,沒有得到響應。正如你所看到的,在statuse.php文件中,我沒有使用任何可以阻止調用的php會話變量。有趣的是,一旦數據庫的處理完成,我確實得到了迴應。也就是說,我收到了文字'hello'。

+0

什麼給你timout錯誤? 這與beeing同步沒有任何關係,如果呼叫同步,一個接一個會被調用,而沒有完成,一切都會被阻止。 – Nic

+0

你能解釋一下你認爲異步的含義嗎? – Popnoodles

+0

對於status.php的每個間隔調用,在計算過程中我都會遇到超時錯誤。 – Goaler444

回答

1

問題是我的服務只使用一個測功機。由於數據庫處理需要一些時間,並且由我的單個動態碼處理,所以其他AJAX請求無法處理。爲了允許併發,需要更多的dynos。

然而,這並不鼓勵,因爲每個用戶目前正在使用該服務需要一個dyno,加上另一個dyno來處理簡單的AJAX請求。鼓勵使用工作者(例如Heroku支持的IronWorker),以便這些長時間的流程不會導致您的動態管理器忙於處理其他請求的程度。

2

您可能正在使用會話。 PHP的默認基於文件的會話處理器會話,而腳本是活動的,所以從目前session_start()被調用時,使用同一個會話沒有其他腳本可以並行運行,因爲這些其它腳本將阻止,並掛在在session_start ()調用,直到第一個腳本完成。

如果希望「進度」檢查調用成功,則必須在數據庫腳本中執行session_write_close(),以便會話鎖被放棄,並且可以繼續執行該會話上的其他請求。

+0

感謝您的發佈。所以即使是狀態。PHP不啓動會話或使用任何會話變量,database.php仍然會鎖定,並不會允許任何其他調用被處理? – Goaler444

+1

如果沒有會話,則發生其他事情。也許你的瀏覽器限制了一個「正在運行」的ajax請求,所以狀態請求必須等到數據庫請求完成。 –

+0

這是我認爲正在發生的事情Marc – Popnoodles