1

当服务器上的 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>

对于新的页面模板,它不是很相关......但是有了这个,我能够重现我在实际应用程序中遇到的锁定问题。

其他人有同样的问题吗?

谢谢。

4

3 回答 3

0

它是否需要在服务器上中止,或者您只想立即重定向用户?

也许像AJAXQueue这样的东西对你有用?(显然需要对您的客户端代码进行更改..)

于 2010-02-26T00:19:11.957 回答
0

好的,我终于明白了应用程序等待的原因:PHP 的会话系统将其他查询排队,直到会话关闭。因此,我的 ajax 调用不需要使用会话,在我的操作花费太长时间之前,我会执行 $this->getUser()->shutdown()。

这里的每一个细节:http: //garethmccumskey.blogspot.com/2009/10/php-session-write-locking-and-how-to.html

于 2010-02-26T17:21:07.427 回答
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");
}

当页面加载时,test1 requete 正在等待结束 usleep(10000000) 但 test2 正在等待 test1 的执行结束。

我用 symfony 解决了这个问题。

于 2010-03-16T10:54:57.053 回答