2011-01-20 127 views
2

我正在使用CakePHP來處理一個應用程序,該應用程序必須通過單個AJAX調用運行耗時的任務,輔助週期性AJAX調用將檢查任務的進度。CakePHP併發AJAX請求阻止

的問題

雖然耗時的任務(可能需要> 30秒)運行通過它的AJAX請求CakePHP中,二次進展AJAX請求似乎不能被「阻塞」。

爲了澄清,二次進展AJAX請求不會返回任何錯誤,它只是在原始的耗時請求完成之前不會返回任何響應。

一旦這個原始的AJAX請求完成,二次進展AJAX請求按預期返回。

看起來,執行進度請求正在排隊,直到第一個AJAX調用完成爲止,因爲返回的進度是100%。

我已經試過

我已經試過多次建議的解決方案,其中包括:

  • 在core.php中更改會話處理程序 '蛋糕' - 沒有鎖定
  • 設置在core.php配置安全級別爲'medium' - 沒有修復
  • 禁用core.php中的用戶代理檢查 - 沒有修復
  • 測試mul併發AJAX調用到同一臺服務器上的普通PHP腳本 - 按預期工作

任何想法?

所以看起來好像這個問題是由CakePHP引起的 - 任何人都有在CakePHP應用程序中體驗過這一點?

謝謝!

回答

0

對於一些澄清,你使用內置的AJAX助手(在原型上)還是像jQuery這樣的外部庫?

通常,選擇的javascript庫有一個{async: true}可用於強制併發。看到這個例子:

$.ajax({ 
    type: 'GET', 
    url: '/fetch.php', 
    async: true, 
    success: function(data, status) { 
     $('#status').html(status); 
    } 
}); 

對於內置CakePHP的AJAX輔助,這個選項應該做的伎倆:$options['type']。更多信息here。請注意,從1.3版開始不推薦使用AJAX幫助程序,並且jsHelper應該能夠接管,例如請參見request()方法here(也有一個選項,稱爲async)。

+0

嗨laander,我使用Prototype,但我不認爲JS框架是問題。我已經能夠通過Prototype實現併發的AJAX調用到非CakePHP服務器..所以看起來「阻塞」發生在CakePHP中的某處。 – Ben 2011-01-20 20:24:32

3

會話處理設置在PHP

到文件從php.ini中

[Session] 
; Handler used to store/retrieve data. 
; http://php.net/session.save-handler 
session.save_handler = files 

這防止PHP運行每個用戶會話的多個實例。

爲了防止這種情況來看,這種在你的PHP代碼:

session_write_close(); 

只知道會話現已結束,寫入會議不再是一個選項。