【问题标题】:Is output buffering possible inside of flush?是否可以在刷新内部进行输出缓冲?
【发布时间】:2013-05-06 05:34:59
【问题描述】:

我试图将函数状态显示为循环,但在下一个显示之前删除之前的状态。当前代码:

<?php
@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();
set_time_limit(0);

// Perform 1st function here
echo "Retrieving Data...";
echo str_repeat(' ',1024*64);
sleep(1);


// Perform 2nd function here
echo "Analyzing Data...";
echo str_repeat(' ',1024*64);
sleep(1);


// Perform 3rd function here
echo "Done...";
echo str_repeat(' ',1024*64);
sleep(1);
// Clean all echos here..
?>
<html>
<head>
 // Dynamic head content as a result of the php functions above
</head>
<body>
</body>
</head>

现在这可以工作了,但会一个接一个地显示所有回声。我希望下一个状态替换第一个状态,直到结束,然后在显示 html 之前删除“完成”。

我试过了:

ob_start();
echo "Retrieving Data...";
echo str_repeat(' ',1024*64);
sleep(1);
ob_end_clean();    

但这没有用。这可能吗?

【问题讨论】:

    标签: php apache buffer flush


    【解决方案1】:

    以下使用 last-of-type 伪 CSS 选择器来隐藏所有旧的进度状态消息。这是一个相当新的选择器,因此在旧浏览器(IE9 之前)上无法正常工作,您可以在Mozilla Developer Network 上检查兼容性

    <html>
    <head>
        <style type="text/css">
            #progress span {
                display: none;
            }
            #progress span:last-of-type {
                display: block; !important
            } 
        </style>
    </head>
    <body>
    <div id="progress">
    <?php
    for ($i =0; $i<=100; $i+=10) {
        ob_start();
        echo "<span>$i%</span>";
        ob_end_clean();  
        sleep(1);
    }
    ?>
    </div>
    </body>
    </html>
    

    【讨论】:

    • @GameDevGuru 我不相信以前有任何方法可以做到这一点。在 HTML 页面上的 &lt;body&gt; 标记之前不应显示任何文本输出。我能想到的唯一可能的解决方法是像上面那样做,然后将处理结果存储在会话变量之类的东西中,然后使用 JavaScript 将用户重定向到另一个页面,这样你就可以在那里重用数据。
    【解决方案2】:

    用 \r 输出你的行。这会将光标返回到同一行上的 0。你可以在哪里写。

    echo "Retrieving Data..\r";
    sleep(3);
    echo "Analyzing Data...\r";
    sleep(3);
    echo "Done...          \r\n";
    

    我在最后一个回显中添加了一个\n,否则命令提示符会覆盖最后一个回显。

    【讨论】:

    • 不,这不起作用。如果这有影响的话,这个脚本在 HTML 之前运行。
    • 哦,您想在 html 页面中进行操作。这适用于命令行。
    • 不,我不能在 html 中这样做,因为我需要 部分中应用的函数中的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2014-10-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多