我有以下代码:
$(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会话变量。有趣的是,一旦数据库的处理完成,我确实得到了回复。也就是说,我得到的文字是'你好'。
答案 0 :(得分:2)
你可能正在使用会话。当脚本处于活动状态时,PHP的默认基于文件的会话处理程序 LOCKS 会话,因此从调用session_start()
的那一刻起,没有其他使用相同会话的脚本可以并行运行,因为其他脚本将阻塞并挂起session_start()调用,直到第一个脚本完成。
如果您希望“进度”检查调用成功,则必须在数据库脚本中执行session_write_close()
,以便放弃会话锁定并继续执行该会话上的其他请求。
答案 1 :(得分:1)
问题是我的服务只使用一个dyno。由于数据库处理需要一些时间并由我的单个dyno处理,因此无法处理其他AJAX请求。为了允许并发,需要更多的动态。
然而,这并不鼓励,因为当前使用该服务的每个用户需要一个dyno,另外还需要另一个dyno来处理简单的AJAX请求。鼓励使用工作人员(例如Heroku支持的IronWorker),这样这些漫长的过程不会导致你的dynos忙于不处理其他请求。