强制PHP桌面流式传输php响应

时间:2018-03-14 17:19:41

标签: phpdesktop

我遇到的问题当我在循环中回显某些东西时,我需要蒸汽输出。现在通常我会放一些像

这样的东西
ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', false);

ob_end_flush();
while (@ob_end_flush());

ini_set('implicit_flush', true);
ob_implicit_flush(true);

header("Content-type: text/html");
header('Cache-Control: no-cache');

在页面顶部,然后调用

echo 'Something to print out here';
ob_flush();
flush();

然而,这根本不起作用。我没有生成任何错误或显示它没有按照需要立即输出而没有缓冲。它似乎完全没有效果。我也试过改变php.ini文件。这也没有效果。我在2个不同版本的PHP桌面上试过这个。我已经在使用PHP 5.4的PHP桌面47.0 Chrome上尝试了它,最新推出的PHP桌面57.0使用PHP 7.我非常感谢任何见解。

UPDATE 我收到了php桌面开发人员的回复,他不知道为什么它没有工作,并建议php桌面使用的Mongoose web服务器可能不支持这个。有没有人比我更有使用猫鼬的经验?除了使用php桌面时,我从未真正使用过它

1 个答案:

答案 0 :(得分:2)

在Mongoose中使输出缓冲区刷新工作的技巧是在调用ob_flush / flush之前输出总共8192个字符。下面的示例代码,阅读php评论和html评论以获取更多详细信息。

<?php

error_reporting(-1);

ini_set('zlib.output_compression', 0);
ini_set('output_buffering', 0);
ini_set('implicit_flush', 1);

// This buffer length value is copied from "mongoose.c" file.
// If you would like to reduce buffer size then modify "mongoose.c"
// file and rebuild phpdesktop from sources.
define("MG_BUF_LEN", 8192);

function fprint($s)
{
    $args = func_get_args();
    call_user_func_array('printf', $args);
    print(str_repeat(" ", MG_BUF_LEN));
    @ob_flush();
    flush();
}

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");

?>

<style type="text/css">@import url("style.css");</style>
<a href="index.php">Go back to index</a>
| <a href="<?php echo $_SERVER["REQUEST_URI"];?>">Refresh</a>

<title>Output buffer flush</title>
<h1>Output buffer flush</h1>

<p>
    This example forces flush of output buffer repeatedly.
</p>
<p>
    This technique works differently with Mongoose web server.
    Mongoose forces to always read 8192 characters (MG_BUF_LEN)
    before sending output. The solution is to output 8192 spaces
    before each ob_flush / flush calls. Spaces are ignored in html,
    so this output is not visible. It should really be 8192
    characters minus characters previously outputted for it to
    work always correctly. In this simple examples this is not
    required.
</p>

<?php

fprint("\r\n\r\n");
sleep(1);
fprint("Slept for 1 second<br>");
sleep(2);
fprint("Slept for 2 seconds<br>");
sleep(3);
fprint("Slept for 3 seconds<br>");
fprint("Done.")

?>

我已将“ob-flush.php”示例提交给phpdesktop:

https://github.com/cztomczak/phpdesktop/blob/2a800fecd8830e4f1e6c4054e74e8d03b4900847/phpdesktop-chrome57/www/ob-flush.php