Javascript 当使用flush()时,浏览器的PHP输出呈现为文本,并在代码中添加数字

Javascript 当使用flush()时,浏览器的PHP输出呈现为文本,并在代码中添加数字,javascript,php,html,browser,flush,Javascript,Php,Html,Browser,Flush,我在不同的服务器上运行相同的代码,在我还没有完全弄清楚的非常特定的情况下,只有一台服务器上运行相同的代码,我的代码失败了,出现了一个非常惊人的问题 以下是我正在做的: 我有一个处理脚本,通常需要几分钟才能运行,因此我从以下代码开始: @apache_setenv('no-gzip', 1); @ini_set('zlib.output_compression', 0); @ini_set('implicit_flush', 1); for ($i = 0; $i < ob_get_leve

我在不同的服务器上运行相同的代码,在我还没有完全弄清楚的非常特定的情况下,只有一台服务器上运行相同的代码,我的代码失败了,出现了一个非常惊人的问题

以下是我正在做的:

我有一个处理脚本,通常需要几分钟才能运行,因此我从以下代码开始:

@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);

$str = <<< STR
<html><head><title>Line Processing</title>
</head>
<body>
<div id="progressAnim" style="height: 20px; width: 250px; border: 1px solid #CCC; padding: 4px 0 0 4px; background-color: #EEE;">
    <img src="/images/formatting/progress_16x16_grey_01.gif" width="16" height="16" style="vertical-align: middle; margin-right: 2px;" />
    <span style="margin-top: 4px;">Page load in progress - please wait...</span>
</div>
<div id="status_time_elapsed" class="status"></div>
<div id="status_percentage" class="status"></div>
<div id="status_saved" class="status"></div>
<div id="status_current" class="status"></div>
<style type="text/css">
[... styles here ...]
</style>
<script type="text/javascript">
function UpdateStatus(curStatus, savStatus, time_elapsed, percentage)
{
    if (percentage != '')
    {
        d('status_percentage').innerHTML = "Estimated overall completion: " + percentage + "% completed.";
    }
    if (savStatus != '')
    {
        d('status_saved').innerHTML += savStatus;
        if (savStatus.indexOf('<div') < 0) d('status_saved').innerHTML += '<br />';
    }
    d('status_current').innerHTML = curStatus;
    d('status_time_elapsed').innerHTML = "Time elapsed since the import started: " + time_elapsed;
}

function d(div)
{
    return document.getElementById(div);
}
</script>
STR;
echo $str;
第四,服务器头也以纯文本显示

因此,需要明确的是:屏幕上的实际输出如下所示:

8f
<script type="text/javascript">
    UpdateStatus('Reading transaction 9601 of 16263...', '', '00:03', '');
</script>
HTTP/1.1 200 OK
Date: Tue, 25 Mar 2014 18:16:42 GMT
Server: Apache/2.2.17 (Linux/SUSE)
X-Powered-By: PHP/5.3.5
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=72
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

5deb
<html><head><title>Line Processing</title>
8f
UpdateStatus('Reading transaction 9601 of 16263…','',00:03','';
HTTP/1.1200ok
日期:2014年3月25日星期二18:16:42 GMT
服务器:Apache/2.2.17(Linux/SUSE)
X-Powered-By:PHP/5.3.5
到期时间:1981年11月19日星期四格林威治标准时间08:52:00
缓存控制:无存储,无缓存,必须重新验证,后检查=0,预检查=0
Pragma:没有缓存
保持活动状态:超时=15,最大=72
连接:保持活力
传输编码:分块
内容类型:text/html
5deb
行处理
然后,我们有头的其余部分的正常输出,然后是所有正常的JavaScript行,直到我们达到输出
读取12264的事务9501
。然后下一行“缺失”(即移到页面顶部),然后继续执行
9701
,并开始在代码的开头或结尾添加数字

因此,它不仅将所有HTML代码(加上http头)呈现为文本并添加数字,还将该行添加到输出的顶部,而不是中间,这可能是我最大的谜团,因为我正在使用
echo
立即向屏幕发送每一位信息

我的脚本成功完成,发送HTML结束标记和最后一个数字
0
added,done

这种情况发生在Windows XP上的Firefox上-我还没有更多关于这方面的信息,但我知道这个版本的Firefox有一个菜单(默认情况下现在是关闭的),没有任何新的菜单按钮(橙色的Firefox按钮或三行按钮),所以可能它只是一个过时的Firefox版本。但是,在同一个浏览器上,大多数情况下脚本工作正常。这个问题是在非常神秘的情况下发生的

web服务器要么在客户端位置,要么在附近某个地方,并通过VPN连接进行连接-我目前没有这方面的信息。但是,大多数情况下,脚本工作正常,我还没有弄清楚它是什么时候完成的

坦白说,我甚至不知道从哪里开始

我猜这可能是一个病毒或一个恶意的Firefox扩展,我将把它传递给客户端进行检查,但这可能是什么呢

若这是一个PHP错误,我不会期望它在屏幕上发送一个2-3位数的代码


想法?

看起来像是“打嗝”…如果这种情况只发生在一个特定的浏览器中(甚至只发生在一台特定的机器上?),但在“任何地方”都可以正常工作-那么它可能是一个处理长时间连续输入流的浏览器错误,或者它在“在线”的某个地方被弄乱了,这意味着网络中客户端和服务器之间的某个地方……但由于信息太少,甚至很难推测。至于从哪里开始调查,我建议在发生这种情况的机器上使用某种工具/扩展,能够记录接收到的数据的每一位(好的,而不是字节),响应头和主体…并查看是否有任何看起来可疑的东西试图证明(或反驳)网络连接或两者之间的任何参与者(防火墙、数据包检查器,你可以说)存在故障。
6d
<script type="text/javascript">
    UpdateStatus('Reading client 801 of 1189...', '', '00:15', '');
</script>
8f
<script type="text/javascript">
    UpdateStatus('Reading transaction 9601 of 16263...', '', '00:03', '');
</script>
HTTP/1.1 200 OK
Date: Tue, 25 Mar 2014 18:16:42 GMT
Server: Apache/2.2.17 (Linux/SUSE)
X-Powered-By: PHP/5.3.5
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=72
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

5deb
<html><head><title>Line Processing</title>