【问题标题】:PHP: Preventing headers & session_startPHP:防止标头和 session_start
【发布时间】:2011-07-04 22:05:47
【问题描述】:

我已经构建了我自己的教育 MVC 框架来了解更多关于 PHP OOP 的信息,我当然拥有,但目前我让自己陷入了困境。我需要在项目的大部分时间使用会话,但还需要在某个页面向用户流式传输文件。

当我在进入我的控制器之前默认调用session_start() 时,当我需要从控制器内部将文件流式传输给用户时,我会遇到臭名昭著的Headers already sent。很合乎逻辑。

当我在控制器中进行会话修改时,我需要事先调用 session_start(),但那时,控制器显然没有加载,我的框架无法判断它是否应该调用session_start() 与否。 使用不需要会话的控制器名称白名单创建文件似乎很原始。

当我需要流式传输文件时,什么是摆脱会话的合适方法?

【问题讨论】:

  • 不确定我是否理解您为什么不能在每个相关文件的第一行中只写一个session_start()
  • header_remove() 在 mod_php 下可能工作也可能不工作。
  • @Pekka - 我相信最好为超越常规的东西制定解决方法,而不是相反。不是吗? :)
  • 也许是我,但我还是不明白。您是否有压倒性的理由根据您的一个课程中的某些条件开始一个课程,而不是总是开始它?您不想在流式传输文件时开始会话吗?如果有,为什么?

标签: php session header stream filestream


【解决方案1】:

启动会话属于引导程序,而不是 IMO 对象。

我倾向于总是从引导程序的第一行开始,无论当前脚本是否需要它。性能影响可能不存在或影响很小。

【讨论】:

  • 嗨,是的 - 我也是这样做的。 session_start() 在调用控制器之前默认在我的引导程序中调用,因此这个问题是关于我如何知道是否调用 session_start()
  • @Industrial 我不明白为什么首先会出现这个问题。如果默认调用session_start,为什么还要在类中启动它?
  • @Pekka - 大多数控制器影响和/或依赖于 $_SESSION 变量,因此我已经默认调用 session_start()。我想要的是一种干净的方法来防止在特定控制器上进行 session_start() 调用
  • @Industrial 我明白了,但是为什么? (不喜欢就不用解释了,好奇就好)
  • @Pekka 据我所知,如果不将文件作为第一个输出发送给用户,就没有其他方法可以将文件流式传输给用户(导致下载对话)。由于 session_start() 被调用 - 标头已经发送并且出现头痛。
【解决方案2】:

如果您的所有请求都指向 index.php 文件,那么您应该从那里开始会话(Headers already sent 问题应该会消失)。记住文件中的 UTF-8 编码(没有 BOM)

【讨论】:

    【解决方案3】:

    使用 OOP。您的控制器必须以某种方式扩展基本 AbstractController。因此,添加一个默认返回 true 的虚拟方法“NeedsSession()”。现在,为不需要会话的控制器覆盖此方法。这样更干净。

    【讨论】:

      【解决方案4】:

      当您发送任何输出时,如果您的文件之一在封闭标记标题将发送到服务器后包含任何空格,则意味着您也在发送标题。如果他们这样做,请检查您的文件

      session_start 必须在任何标头发送到服务器之前调用。文件中不应包含任何空格,请仔细检查文件是否在开头或结尾包含任何空格

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 2017-01-30
        • 1970-01-01
        • 2012-08-01
        相关资源
        最近更新 更多