同时使用ob_start()和ob_implicit_flush(true)会导致问题

时间:2018-08-07 11:49:24

标签: php header flush ob-start

我需要在执行php文件时回显一些输出,因为执行需要10秒,而10sec页面的结束应通过header("Location:test.php)定向

但是,如果我同时使用 ob_start ob_implicit_flush(true ),我们将无法定向页面并获得

  

警告:无法修改标题信息-

已发送的标题

我还需要在执行时使用ob_implicit_flush(true)打印输出。

如何显示输出和直接页面?

2 个答案:

答案 0 :(得分:0)

您不能在同一响应中同时输出正文内容 header ,输出的内容少得多标头之前。 HTTP标头排在最前面,因此您不能在标头之前输出主体,也不能在输出标头之后输出标头。此外,重定向标头会导致该请求在浏览器显示其任何内容之前立即被重定向,因此整个操作在两个级别上均无法正常工作。

如果要在服务器执行某项操作时显示任何内容,则需要使用某种形式的Javascript。

答案 1 :(得分:0)

如果使用header()函数,则在此之前必须没有输出。但是当然可以在使用该功能之后。

ob_start使缓冲区开始工作,而ob_implicit_flush告诉根本不使用缓冲区。因此,这两种功能不能以这种方式组合。

示例:

ob_start(); //set buffer on
print('Hello World'); //no output since buffer on
ob_implicit_flush(true); //buffer switched off again
print('Test'); //prints 'Hello World' and 'Test'
header('Location: ...'); //ERROR: output already done

您现在必须决定是要从脚本中输出信息还是进行重定向。
可以输出一些AFTER标头,但是没有意义,因为您将不再看到它。

也许您可以使用ob_get_length()函数检查是否有某些输出,然后决定是否切换页面或输出缓冲区:

ob_start(); //set buffer on
print('Hello World'); //no output since buffer on
if(ob_get_length() > 0)
  ob_end_flush();
else
  header('Location: ...'); //will not be executed if output was generated