【问题标题】:ob_flush works offline, not onlineob_flush 离线工作,不在线
【发布时间】:2015-06-12 11:20:28
【问题描述】:

我正在尝试在上传照片时显示图像,以便用户知道我的网站正在做某事,而不是坐在那里。由于某种原因,我可以让它离线正常工作,但不能在线工作。这是我的代码的相关部分:

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
    echo '<div id="progress"><img src="images/ani_hiker.gif"/>
        <p align="center">Photos uploading...<br/>slow and steady!</p></div>';
    ob_end_flush();
    flush();
    ob_flush();
    foreach ($_FILES['files']['name'] as $i => $name) {
          //uploading files junk
    }
    echo '<script language="javascript">
        alert("Photos added successfully!");
        window.location.href="index.php?username='.$profile_link.'&select=photos";
        </script>';

如前所述,离线工作,而不是在线工作。当我在线尝试时,照片会上传,并且 div 会在上传完成后而不是在上传期间显示,并显示在警报框下方。直到您在警告框中单击“确定”后,div 内的图像才会出现,然后在 div 消失之前闪烁一瞬间,您将被带到另一个页面(如预期的那样)。

我觉得这一定是我的服务器的某种设置,但我不知道是什么。我联系了我的托管公司,我们为我的整个站点禁用了输出缓冲,但这并没有解决问题。我已经恢复了输出缓冲,它的行为和往常一样。

【问题讨论】:

  • 禁用输出缓冲会使ob_ 函数不执行任何操作...
  • 看到这个答案:stackoverflow.com/a/4978642/811240
  • 我根本看不出它应该如何工作。将 HTTP 文件上传到 PHP 脚本时,您的接收脚本仅在上传本身已经完成完全时才开始——因此不应尝试以这种方式显示上传进度根本工作,而不是“本地”,而不是其他任何地方。如果你想用 PHP 做这样的事情,那么你必须按照Session Upload Progress 章节中的描述来实现它。
  • “至少是这样的想法” – 是的,这是一个完全错误的想法。 PHP 只会启动作为文件上传目标的任何脚本,当上传本身完成时 - 所有 服务器接收到的数据,上传临时文件夹中的临时文件已经创建,等等。 “它写在上传图片的循环之外,最重要的是,写在它上面,所以它应该首先发生”——不,这根本不是它的工作原理。 […]
  • [...] 文件不会在循环内“上传”,它们只是从临时文件夹移动到永久位置;同样,到那时上传本身已经完成。您不能在“之前”输出任何 HTML 代码,无论它是否被缓冲,仅仅是因为您的脚本没有开始上传位完成。输出 HTML 代码的这部分“写在”应该移动文件的部分之上,并不会改变一般的底层逻辑。

标签: php flush


【解决方案1】:

所需的行为似乎是并且永远是您的本地计算机独有的 -

来自php.net manual

截至 2012 年 8 月,所有浏览器似乎都显示了全有或全无 缓冲的方法。换句话说,当 php 运行时,没有 可以显示内容。

这尤其意味着以下解决方法进一步列出 下面是无效的:

1) ob_flush()、flush()与其他输出任意组合 缓冲函数;

2) 对 php.ini 的更改涉及设置 output_buffer 和/或 zlib.output_compression 为 0 或关闭;

3) 通过设置 Apache 变量,例如“no-gzip” apache_setenv() 或通过 .htaccess 中的条目。

因此,在浏览器再次开始显示缓冲内容之前,提示 这里列出的没有实际意义。

【讨论】:

  • 这似乎不是浏览器问题,因为 OP 说它“离线”工作(我假设这意味着在本地 Web 服务器上)。
猜你喜欢
  • 2017-06-05
  • 1970-01-01
  • 2012-01-14
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多