【问题标题】:Two Ajax calls not working concurrently (heroku)两个 Ajax 调用不能同时工作(heroku)
【发布时间】:2013-01-05 19:39:26
【问题描述】:

我有以下代码:

$(window).load(function()
{
    $('#content1').load('database.php');
    setInterval (function() 
    { 
        $.post('status.php', { id: '1'}, function(responseText, responseStatus)
        { 
            $('#content2').html(responseText); 
        });  
    }, 5000);
});

基本上,我调用 database.php 进行一些数据库插入,并使用周期性间隔来获取其进度状态。问题是在插入期间,间隔帖子给了我请求超时错误。只有在 database.php 完成处理后,才会写入 content2 中的文本。

现在我在 status.php 文件中使用了非常简单的代码,只是为了查看在处理 database.php 时是否可以得到响应。下面是代码(很简单):

<?php
    echo "hello";
?>

我不知道为什么我收到超时错误但没有得到响应。如您所见,在 statuse.php 文件中,我没有使用任何可以阻止调用的 php 会话变量。有趣的是,一旦数据库的处理完成,我确实得到了响应。也就是说,我得到了文本“你好”。

【问题讨论】:

  • 出现超时错误是什么原因?这与beeing同步无关,如果同步的调用,一个接一个的会被调用,在没有完成的时候,其他的都会被阻塞。
  • 你能解释一下你认为异步是什么意思吗?
  • status.php 的每个间隔调用,在计算过程中都会出现超时错误。
  • 为什么 AJAX 是异步的这一事实会让你相信你的调用不应该超时?
  • 嗯,你能给我推荐一个更好的标题吗

标签: php jquery ajax heroku concurrency


【解决方案1】:

您可能正在使用会话。 PHP 的默认基于文件的会话处理程序 LOCKS 在脚本处于活动状态时会话,因此从调用 session_start() 的那一刻起,不能像其他脚本那样并行运行使用同一会话的其他脚本将阻塞并挂起 session_start() 调用,直到第一个脚本完成。

如果您希望您的“进度”检查调用成功,您必须在数据库脚本中执行session_write_close(),以便放弃会话锁定并且该会话上的其他请求可以继续。

【讨论】:

  • 感谢您的帖子。所以即使 status.php 没有启动会话或使用任何会话变量,database.php 仍然会锁定并且不允许处理任何其他调用?
  • 如果没有会话,那么就会发生其他事情。也许您的浏览器限制了一个“正在运行”的 ajax 请求,因此状态请求必须等到数据库请求完成。
  • 这就是我认为正在发生的事情,马克
  • @MarcB 是的,很可能你是对的。这也可能是因为我使用的是免费的 heroku 帐户,并且可能只允许一个 ajax 请求。但是,从我查看的所有内容中,我没有发现这一点。
【解决方案2】:

问题是我的服务只使用了一个测功机。由于数据库处理需要一些时间并且由我的单个测功机处理,因此无法处理其他 AJAX 请求。为了允许并发,需要更多的测功机。

但是,不鼓励这样做,因为每个当前使用该服务的用户都需要一个 dyno,再加上另一个 dyno 来处理简单的 AJAX 请求。鼓励使用工作线程(例如 Heroku 支持的 IronWorker),这样这些冗长的过程就不会导致您的测功机忙到无法处理其他请求的程度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 2014-09-29
    相关资源
    最近更新 更多