php - 可能 "undo"在 PHP 脚本中发送 HTTP header 和此类中间执行?

标签 php http buffer

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

举个例子:

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

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

我知道我可以移动我的 <?php..上面的语句位 <html>使这项工作,但我试图涵盖所有可能的用例(包括糟糕的代码设计)。

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

最佳答案

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

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

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


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

关于php - 可能 "undo"在 PHP 脚本中发送 HTTP header 和此类中间执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278975/

相关文章:

php - 使用 php 和 mysql 自动注销

php - MySQL WHERE...IN 查询

java - "PUT"请求与 oauth2

c++ - 快板 C++;闪烁位图

c++ - 是否可以直接保留并复制到 std::string 中?

php - 如何向 Mantis 工作流程添加新状态?

php - 如何在 PHP 中跨域使用像素跟踪

浏览器不尊重 HTTP Expires header ?

http - nopCommerce:使用 web api 更改具有不同选项的一种产品的价格

Vim:用默认缓冲区替换选择而不覆盖缓冲区