【发布时间】:2011-01-21 06:26:57
【问题描述】:
当服务器上的 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>
因此,当 get 被触发,然后在我单击链接后,服务器会在将我带到另一个页面之前完成第一次调用。我的问题是我想避免这种行为。
我在 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>
对于新的页面模板,它不是很相关......但是有了这个,我能够重现我在实际应用程序中遇到的锁定问题。
其他人有同样的问题吗?
谢谢。
【问题讨论】:
标签: php ajax symfony1 server-side request-cancelling