可以在PHP脚本中“撤消”发送HTTP标头和此类执行中


Possible to "undo" sending HTTP headers and such mid-execution in a PHP script?

我正在写一个小的PHP认证库(请推迟"不要自己写"。我以前做过)。作为我的库的一部分,我希望能够在某些情况下"中止"执行。

例如,举个例子:

<html>
<head></head>
<body>
<?php
  $auth=... 
  $auth.RequiresInGroup("admin");
?>
</body>
</html>

我想RequiresInGroup做的基本上是检查用户是否已登录(通过查看cookie等),如果他们未登录或在该组中,那么它需要发回401错误并执行服务器端重定向到未经授权的页面。

我知道我可以将我的<?php..语句移到<html>上方以使其工作,但我正在尝试涵盖所有可能的用例(包括糟糕的代码设计)。

PHP 中有没有一种方法可以基本上推迟向客户端发送内容,直到请求结束,或者以类似的方式在执行过程中发送不同的 HTTP 标头,然后退出脚本?

您需要

阅读手动 http://www.php.net/manual/en/ref.outcontrol.php 的"控制输出缓冲部分"

标头本身不会发送,直到您的第一位输出 - 然后发送响应代码,然后是您设置的客户标头。您可以查看它们是否已使用 headers_sent() 函数发送。但是,一旦设置了标题,您实际上就无法取消标头。

因此,缓冲您需要发送的内容,然后在应用程序结束时吐出缓冲区。


编辑:执行此操作的另一种方法(以及我更喜欢的方式,尽管它依赖于全局或单例类,但两者都可能不受欢迎)是创建自己的"输出"类。 将其设置为全局(或单例)并将输出附加到该类。然后,您可以随意发送标头,并在执行结束时抽取输出。不像ob_functions那样"单元测试友好",但更容易调试和控制。