两个Ajax调用无法同时工作(heroku)

时间:2013-01-05 19:39:27

标签: php jquery ajax heroku concurrency

我有以下代码:

$(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会话变量。有趣的是,一旦数据库的处理完成,我确实得到了回复。也就是说,我得到的文字是'你好'。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

然而,这并不鼓励,因为当前使用该服务的每个用户需要一个dyno,另外还需要另一个dyno来处理简单的AJAX请求。鼓励使用工作人员(例如Heroku支持的IronWorker),这样这些漫长的过程不会导致你的dynos忙于不处理其他请求。