我已经构建了自己的教育MVC框架,以了解有关PHP OOP的更多信息,我当然拥有它,但目前我已经陷入了困境。我需要在整个项目的大部分时间内使用会话,但还需要在特定页面上将文件流式传输给用户。
当我在进入我的控制器之前默认调用session_start()
时,当我需要将文件从控制器内部流式传输到用户时,我会把臭名昭着的Headers already sent
扔在我脸上。很合乎逻辑。
当我在控制器内进行会话修改时,我需要预先调用session_start()
,但那时,控制器显然没有加载,我的框架无法判断是否应该是否致电session_start()
。
使用不需要会话的白名单控制器名称创建文件似乎很原始。
当我需要流式传输文件时,摆脱会话的适当方法是什么?
答案 0 :(得分:2)
使用OOP。您的控制器必须以某种方式扩展基础AbstractController。因此,添加一个虚拟方法“NeedsSession()”,默认情况下返回true。现在,为不需要会话的控制器覆盖此方法。这样更干净。
答案 1 :(得分:2)
启动会话属于引导程序,而不是IMO对象。
我倾向于总是从引导程序的第一行开始,无论是否在当前脚本中都需要它。性能影响可能不存在或很少。
答案 2 :(得分:1)
当您发送任何输出意味着您正在发送标题,如果您的文件之一包含任何空格,则封闭标记标题将被发送到服务器。如果他们做了这件事,请检查你的文件
必须在发送到服务器的任何标头之前调用 session_start
。文件中不应有任何空格,如果它们在开始或结束时包含任何空格,请仔细检查文件
答案 3 :(得分:0)
如果您的所有请求都指向index.php文件,那么您应该开始会话(Headers already sent
问题应该消失)。请记住文件中的UTF-8编码(无BOM)