PHP:防止头文件&;会话(u)开始

PHP:防止头文件&;会话(u)开始,php,session,header,stream,filestream,Php,Session,Header,Stream,Filestream,我已经建立了自己的教育性MVC框架来学习更多关于PHP OOP的知识,我当然有,但目前我陷入了困境。我需要在项目的大部分时间使用会话,但也需要在特定页面上向用户流式传输文件 当我在进入控制器之前默认调用session\u start()时,当我需要将文件从控制器内部流式传输给用户时,我会收到已发送的臭名昭著的头文件。很合乎逻辑 当我在控制器内进行会话修改时,我需要事先调用session\u start(),但当时控制器显然没有加载,我的框架无法判断它是否应该调用session\u start()

我已经建立了自己的教育性MVC框架来学习更多关于PHP OOP的知识,我当然有,但目前我陷入了困境。我需要在项目的大部分时间使用会话,但也需要在特定页面上向用户流式传输文件

当我在进入控制器之前默认调用
session\u start()
时,当我需要将文件从控制器内部流式传输给用户时,我会收到已发送的臭名昭著的
头文件。很合乎逻辑

当我在控制器内进行会话修改时,我需要事先调用
session\u start()
,但当时控制器显然没有加载,我的框架无法判断它是否应该调用
session\u start()
。 创建一个包含不需要会话的控制器名称白名单的文件似乎相当原始


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

当您发送任何输出时,若您的一个文件包含任何空格,则意味着您也在发送头,在将附带的标记头发送到服务器之后。检查你的文件,如果他们做了这件事


在将任何头发送到服务器之前,必须调用会话启动。文件中不应包含任何空格。若文件在开始或结束时包含空格,请仔细检查。当您发送任何输出时,若您的一个文件包含任何空格,则表示您也在发送头。在将封闭标记头发送到服务器之后,若您的一个文件包含任何空格,则表示您正在发送头。检查你的文件,如果他们做了这件事


在将任何头发送到服务器之前,必须调用会话启动。文件中不应包含任何空格。如果文件开头或结尾包含空格,请仔细检查文件。使用OOP。控制器必须以某种方式扩展基本抽象控制器。因此,添加一个默认返回true的虚拟方法“NeedsSession()。现在,为不需要会话的控制器重写此方法。这样更干净。

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

如果您的所有请求都指向index.php文件,您应该在那里启动会话(
已发送的头文件)
问题应该消失)。记住文件中的UTF-8编码(没有BOM)

如果您的所有请求都指向index.php文件,那么您应该从该文件开始会话(
已发送的头)
问题应该消失)。还记得文件中的UTF-8编码吗(没有BOM)

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


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

启动会话属于引导,而不是对象


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

我不知道为什么不能在每个相关文件的第一行执行
会话\u start()
header\u remove()
在mod_php下可能工作,也可能不工作。@Pekka-我认为最好解决常规的问题,而不是相反。是吗?:)也许是我,但我还是不明白。你是否有一个压倒性的理由根据你的课程中的某些条件开始课程,而不是总是开始课程?您不想在流式传输文件时启动会话吗?如果是这样,为什么?我不知道为什么不能在每个相关文件的第一行执行
session\u start()
header\u remove()
在mod\u php下可能工作,也可能不工作。@Pekka-我认为最好是对超出常规的内容进行变通,而不是相反。是吗?:)也许是我,但我还是不明白。你是否有一个压倒性的理由根据你的课程中的某些条件开始课程,而不是总是开始课程?您不想在流式传输文件时启动会话吗?如果是,为什么?嗨,是的,我也是这样做的。默认情况下,在调用控制器之前,会在我的引导程序中调用
会话\u start()
,因此,这个问题是关于我如何知道是调用
会话\u start()
还是not@Industrial我一开始不明白为什么会出现这个问题。如果默认情况下调用了
session\u start
,为什么要在类内部启动它?@Pekka-大多数控制器影响和/或依赖于$\u session变量,因此我将
session\u start()
设置为默认调用。我想要的是一种干净的方式来防止在特定的服务器上进行session_start()-调用controllers@Industrial我明白了,但是为什么呢?(如果你不喜欢,无需解释,只是好奇而已)@Pekka从我所知,没有其他方法可以将文件流式传输给用户(导致下载对话),而不将其作为第一个输出发送给用户。当调用session_start()时,已经发送了头文件,并且出现了头痛。嗨,是的,我也是这样做的。默认情况下,在调用控制器之前,会在我的引导程序中调用
会话\u start()
,因此,这个问题是关于我如何知道是调用
会话\u start()
还是not@Industrial我一开始不明白为什么会出现这个问题。为什么会