1

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

例如,举这个例子:

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

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

我知道我可以将我的<?php..声明移到上面<html>来完成这项工作,但我试图涵盖所有可能的用例(包括糟糕的代码设计)。

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

4

1 回答 1

2

您需要阅读手册http://www.php.net/manual/en/ref.outcontrol.php的“控制输出缓冲部分”

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

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


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

于 2012-07-01T02:33:58.053 回答