2010-02-26 35 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