2

我有以下代码:

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

4

2 回答 2

2

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

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

于 2013-01-05T19:59:31.773 回答
1

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

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

于 2013-01-16T03:35:48.370 回答