PHP输出缓冲

PHP输出缓冲,php,Php,简单问题: 如果我启用输出缓冲 ob_start(); $a = true; header('Location: page.php'); $a = false; ob_end_flush(); 。。。$a会被注册为false,还是只重定向页面而不处理命令(如果未启用输出缓冲,则会这样) 谢谢 除非在标题重定向后调用exit()或die(),否则,$a将为false,因为页面的其余部分将继续解析(有或没有缓冲) 除非您有特殊原因,标题(“位置:…”后面应始终跟有上述函数之一,以避免

简单问题:

如果我启用输出缓冲

ob_start();
  $a = true;
  header('Location: page.php'); 
  $a = false;
ob_end_flush();
。。。$a会被注册为false,还是只重定向页面而不处理命令(如果未启用输出缓冲,则会这样)

谢谢

除非在标题重定向后调用
exit()
die()
,否则,$a将为false,因为页面的其余部分将继续解析(有或没有缓冲)


除非您有特殊原因,
标题(“位置:…”
后面应始终跟有上述函数之一,以避免浪费cpu周期或内存。

输出缓冲仅做名称所推断的事情。它只缓冲输出,不缓冲变量赋值或对象状态。在这种情况下,
$a
将在您提供的代码示例末尾设置为
false
。之后会发生什么取决于您的代码执行。

它将重定向到page.php,而不必*处理其余的命令


*从技术上讲,执行在头调用之后继续,除非您在(死,退出)之后特别停止它。如果只是设置变量和显示内容,您永远不会注意到这一点,但是如果您有更改数据库的命令,则很难找到这些更改的来源。

谢谢-因此,为了澄清一下,如果我在header()命令之后立即指定exit(),它将忽略其他命令,即使启用了输出缓冲?是的,使用
exit()
将自动将缓冲区中的任何内容刷新到浏览器。您可以在退出之前使用
ob\u end\u clean()
来防止这种情况。请记住
标题('Location:…')
建议客户端发送新请求(在将来的某个时候;您不知道这是否会发生以及何时发生)。对于每个请求,都会创建一个新的php实例。在旧实例中设置$a=false对新实例没有影响。因此,如果我将$a替换为$_session['a'],那么它将变得混乱,除非在头调用后退出(),对吗?php的默认会话处理程序会锁定会话文件。“new”请求的php实例必须等待,直到旧实例停止会话机制(通过调用session_write_close()或终止脚本)