两个Ajax调用没有并发工作(heroku)


Two Ajax calls not working concurrently (heroku)

我有以下代码:

$(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文件中使用非常简单的代码,只是为了看看我是否可以在处理数据库.php时得到响应。下面是代码(非常简单):

<?php
    echo "hello";
?>

我不知道为什么我得到一个超时错误,没有得到响应。正如您所看到的,在status .php文件中,我没有使用任何可以阻止调用的php会话变量。有趣的是,一旦数据库的处理完成,我就会得到一个响应。也就是说,我得到了文本"hello"

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

如果你想让你的"进度"检查调用成功,你必须在数据库脚本中做一个session_write_close(),这样会话锁就会被释放,并且该会话上的其他请求可以继续。

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

但是,不鼓励这样做,因为需要为当前使用该服务的每个用户提供一个动态图,再加上另一个动态图来处理简单的AJAX请求。建议使用worker(例如Heroku支持的IronWorker),以便这些长进程不会导致您的动态服务器繁忙到无法处理其他请求的程度。