PHP输出缓冲

3
3个回答

8

除非在重定向头信息之后调用exit()die(),否则页面的其余部分将继续解析(无论是否使用缓冲)。

除非有特殊原因,否则应该始终在header("Location: ...");之后跟上上述函数,以免浪费CPU周期或内存。


谢谢 - 所以只是为了澄清,如果我在header()命令之后立即指定exit(),即使启用了输出缓冲,它也会忽略进一步的命令吗? - RC.
是的,使用 exit() 将自动刷新缓冲区中的内容到浏览器。您可以在退出之前使用 ob_end_clean() 来防止这种情况发生。 - Mike B
1
请记住,header('Location:...')指示客户端在将来的某个时间发送新请求(您不知道是否以及何时会发生)。每个请求都会创建一个新的php实例。在旧实例中设置$a=false对新实例没有影响。 - VolkerK

2

输出缓冲仅仅做其字面意思,不多也不少。它只缓存输出,而不是变量赋值或对象状态。在这个例子中,$a 在你提供的代码示例结束时将被设置为 false。之后发生的事情取决于你的代码执行。


1

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

*从技术上讲,在头部调用之后,执行将继续进行,除非您在之后明确停止它(使用die、exit)。如果您只是设置变量并显示内容,则永远不会注意到这一点,但如果您有更改数据库的命令,则很难找出这些更改来自哪里。


如果我用 $_SESSION['a'] 替换 $a,那么除非在 header 调用后使用 exit(),否则会变得混乱,对吗? - RC.
PHP 的默认会话处理程序在会话文件上保持锁定。对于“新”请求的 PHP 实例将不得不等待旧实例停止会话机制(通过调用 session_write_close() 或终止脚本)。 - VolkerK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接