【问题标题】:Symfony : ajax call cause server to queue next queriesSymfony:ajax调用导致服务器排队下一个查询
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您好,我有同样的问题,使用类似的脚本。

        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 解决了这个问题。

        【讨论】:

        • 是的,事实上我注意到 getUser()->shutdown() 也不足以关闭我的会话,我必须在之后添加一个 session_write_close()。你可以试试这个,但要确保之后你不需要访问会话中的任何内容。
        猜你喜欢
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多