2010-02-26 34 views
1

我的應用程序有一個問題,當服務器上的ajax調用花費太多時間時:它排隊所有其他用戶的查詢,直到完成服務器端(我意識到取消呼叫客戶端不起作用,用戶仍然需要等待)。Symfony:ajax調用導致服務器排隊的下一個查詢

這裏是我的測試案例:

<script type="text/javascript" src="jquery-1.4.1.min.js"></script> 

<a href="another-page.php">Go to another page on the same server</a> 


<script type="text/javascript"> 
    url = 'http://localserver/some-very-long-complex-query'; 
    $.get(url); 
</script> 

所以,當得到的是開除,然後後,我點擊鏈接,把我送到其他頁面之前服務於第一個呼叫服務器完成。我的問題是我想避免這種行爲。

我在一個LAMP服務器上,我正在尋找一種方式來通知服務器,用戶中止了查詢函數,如connection_aborted(),你認爲這是該走的路嗎?另外,我知道這個PHP腳本的最長部分是MySQL查詢,所以即使我知道connection_aborted()可以檢測到用戶取消了這個調用,但我仍然需要在MySQL查詢過程中檢查這個問題...我'米並不確定PHP可以處理這種「事件」。

所以,如果你有什麼更好的想法,我等不及聽到它。

謝謝。


更新: 經過進一步調查,我發現這個問題只發生與Symfony框架(我忽略了精確的,我的壞)。似乎Ajax調用會鎖定任何其他未來呼叫。它可能與控制器或路由系統有關,我正在研究它。

另外對於那些對這個問題感興趣的人來說,我的新測試用例是: -Symfony 1.4.3的新項目,默認配置,我剛創建了一個應用程序和一個默認模塊。 -jquery 1.4用於ajax查詢。

這是我的actions.class.php(在我的獨特模塊):

class defaultActions extends sfActions 
{ 
    public function executeIndex(sfWebRequest $request) 
    { 
    //Do nothing 
    } 

    public function executeNewpage() 
    { 
    //Do also nothing 
    } 

    public function executeWaitingaction(){ 
    // Wait 
    sleep(30); 
    return false; 
    } 

} 

這是我indexSuccess.php的模板文件:

<script type="text/javascript" src="jquery-1.4.1.min.js"></script> 

<a href="<?php echo url_for('default/newpage');?>">Go to another symfony action</a> 


<script type="text/javascript"> 
    url = '<?php echo url_for('default/waitingaction');?>'; 
    $.get(url); 
</script> 

對於新的頁面模板,它不是非常相關...但有了這個,我能夠重現我在真實應用程序中遇到的鎖定問題。

是否有其他人有同樣的問題?

謝謝。

回答

0

是否需要在服務器上中止,或者您是否希望用戶立即重定向?

也許像AJAXQueue會爲你工作? (對你的客戶端代碼有明顯的需要修改..)

0

你好,我有同樣的問題,有一個類似的腳本。

jQuery腳本

$.ajax({url :'/map/test1', async:true ,complete: function(){alert("test1")}}); 
$.ajax({url :'/map/test2', async:true ,complete: function(){alert("test2")}}); 

Symfony的PHP

public function executeTest1() 
{ 
$this->getUser()->shutdown(); 
usleep(10000000); 
return $this->renderText("Oki"); 
} 

public function executeTest2() 
{ 
return $this->renderText("Oki"); 
} 

當頁面加載,測試1 requete正在等待最終usleep(10000000),但TEST2正在等待測試1的執行結束。

我已經用symfony解釋了這個問題。

+0

是的,其實我注意到getUser() - > shutdown()還不足以關閉會話,我不得不在之後添加session_write_close()。你可以試試這個,但是確保你不需要在會話中訪問任何東西。 – Remiz 2010-03-19 18:32:04