奇怪的PHP隐藏的iFrame问题(COMET)输出刚刚停止

时间:2013-04-24 11:30:44

标签: php windows iis iframe comet

我有一个奇怪的问题,使用PHP和隐藏的iFrame从长时间运行的脚本接收状态更新。我有使用FastCGI和PHP 5.3.13的IIS 7.5。它可以随机运行一段时间(3分钟到12分钟之间),但随后输出就会停止,看起来好像与浏览器的连接已经丢失(脚本仍然在后台运行)。我已经尝试了一百万种不同的东西,直到脚本结束才能使它工作(脚本是数据库导入,最多可能需要60分钟)。

在我的主要代码中:

<script>
function onLoad()
{
  document.frmProgress.submit();
}

function updateProgress(status)
{
  document.getElementById('progress').innerHTML = "<h2>" + status + "</h2>";
}

</script>
</head>

<body class='outlookbar' onload='onLoad()'>
<table cellpadding="0" cellspacing="0" border="0" height="100%" width="100%">

... blah ....

<td align='center'>
   <div id="progress"><h2>Processing...</h2></div>
   <iframe height="0" id="progressFrame" name="progressFrame"></iframe>
</td>

... blah ....

<form id="frmProgress" target="progressFrame" name="frmProgress" action="test.php" method="POST">
    <input name="chkReports" id="chkReports" type="hidden" value='<?php echo $chkReports ?>'>
    <input name="chkStudents" id="chkStudents" type="hidden" value='<?php echo $chkStudents ?>'>
</form>

在test.php(长时间运行的脚本 - 这只是一个现在的测试)我有:

<?php
header('Content-Encoding: chunked');
header('Transfer-Encoding: chunked');
header('Content-Type: text/html');
header('Connection: keep-alive');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
ob_flush();
flush();

set_time_limit(0);

function dump_chunk($chunk) {
    echo sprintf("%x\r\n", strlen($chunk));
    echo $chunk;
    echo "\r\n";
    ob_flush();
    flush();
}
function statusUpdate($string)
{
   dump_chunk("<script language='javascript'>parent.updateProgress('" . $string . "');</script>");
}
function finished(){
   dump_chunk("");
}

$text = str_pad("", 1024, " ");
dump_chunk($text);

for ($i = 1; $i <= 3600; $i++) {
    statusUpdate("Count : " . $i);
    sleep(1);
}

finished();
?>

它可以正常使用主页面上的计数器(包含隐藏的iFrame),显示计数递增动态,直到它达到120到450之间的随机点,然后它就会停止,并且不再向hiddent iFrame输出虽然脚本继续运行。

任何帮助都非常感激,因为我一直在试图弄清楚为什么它只是停止输出。非常感谢。

编辑:好的,我好像修好了它现在正在工作。因此对于可能遇到同样问题的其他任何人来说,即使脚本仍在运行,从php脚本到隐藏的iFrame的流内容似乎也无缘无故停止,请尝试在脚本顶部添加以下内容:

ini_set('zlib.output_compression', 'Off'); 

这似乎解决了它造成的问题。仍然不知道为什么这会有所作为。

修改 好的,我说得太早了。仍然不知道这有什么问题。它又回到了停止状态。它可能与我流回iFrame的标签数量有关吗?还是内存限制?或者是其他东西?

0 个答案:

没有答案