首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ob_implicit_flush()、ob_flush()、ob_flush()-不在远程服务器上工作

ob_implicit_flush()、ob_flush()、ob_flush()-不在远程服务器上工作
EN

Stack Overflow用户
提问于 2015-09-12 12:01:44
回答 3查看 5.6K关注 0票数 5

如果我从XAMPP上的本地服务器上以chrome加载此脚本:

代码语言:javascript
复制
header("Content-Type:text/plain");

set_time_limit(0);

$max = 40;
for ($i = 0; $i < $max; $i++) {
    $response = array(  'server time: ' . date("h:i:s", time()), 'progress' => round($i/$max*100));
    echo json_encode($response);
    ob_flush();
    flush();
    sleep(1);
}
ob_clean();

如您所料,该页面每秒钟显示一个新的响应。但是,当我将它上传到远程服务器(运行相同版本的php)时,它会等到整个脚本完成后才会显示输出。在非常长的脚本中,它每30-60秒左右更新一次输出。

正如标题所示,我尝试过使用所有不同的刷新函数,但都没有效果。我的本地服务器和远程服务器的php.ini可能有一些不同,但我不知道是什么。

请帮帮忙。

编辑

我一直在做更多的测试。我注意到,它只是每4096字节更新一次,这恰好是我的远程服务器的php值的'output_buffering‘。但是,由于某种原因,如果我将output_buffering更改为“1”或“off”,则不会发生任何变化。它仍然每4096字节更新一次。

我正在同一浏览器的不同服务器上测试两个相同的脚本。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-22 17:57:57

我没有考虑到nginx,它有自己的输出缓冲区。

我只是在php脚本的顶部添加了‘header(“:no”),现在一切都很好了。

票数 14
EN

Stack Overflow用户

发布于 2015-09-29 12:05:55

对我来说,添加header('Content-Encoding: none');就能做到这一点。在使用PHP时需要这样做。

票数 10
EN

Stack Overflow用户

发布于 2015-09-12 12:18:55

在您需要使用开始()清洁()之前。并添加标题Content-LengthTransfer-Encoding: chunked。并检查«implicit_flush»是否在您的php.ini中

添加用于响应的填充。检查此代码:

代码语言:javascript
复制
<?php

set_time_limit(0);
ob_start();

header('Content-Type: text/plain');

define("PADDING", 16);

//+padding
for($i=0;$i<PADDING;$i++){
    //64 spaces (1 block)
    echo str_repeat(' ', 64);
}

$max = 40;
for ($i = 0; $i < $max; $i++) {
    $response = array(  'server time: ' . date("h:i:s", time()), 'progress' => round($i/$max*100));
    echo json_encode($response);
    ob_flush();
    flush();
    sleep(1);
}
ob_end_clean();

?>
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32538548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档