PHP:会话的拇指规则

PHP:会话的拇指规则,php,session,Php,Session,我不得不把我过于复杂的项目(大约100个文件)分解成小文件。一个问题是,仍然很难看到逻辑,得到大量的会话错误: `Cannot send session cookie - headers already sent by` 如何管理会话命令,例如“会话开始”和“ob结束刷新”?您是将它们添加到index.php的开头和结尾,还是有一些集中的文件来管理它们 请对每个答案使用一条拇指规则。也许您可以使用会话自动启动来确保会话在任何输出之前启动 所有这些错误通常意味着您已经输出了一些内容。我解决这个问

我不得不把我过于复杂的项目(大约100个文件)分解成小文件。一个问题是,仍然很难看到逻辑,得到大量的会话错误:

`Cannot send session cookie - headers already sent by`
如何管理会话命令,例如“会话开始”和“ob结束刷新”?您是将它们添加到index.php的开头和结尾,还是有一些集中的文件来管理它们


请对每个答案使用一条拇指规则。

也许您可以使用会话自动启动来确保会话在任何输出之前启动


所有这些错误通常意味着您已经输出了一些内容。我解决这个问题的方法是使用一些模板引擎来帮助我记住,在我完成所有其他操作之后,只在一个地方发送输出。我用过,但还有很多其他的。

  • 使用某种响应对象来聚合数据/标题。

    这允许您确保可以同时发送所有头,并且仅在必要时启动会话等

    专业人士

    • 简化响应处理
    • 使您能够聚合内容,并在引发异常时发送不同的输出,因为客户端尚未收到任何数据
    缺点

    • 您将无法尽早向客户端发送数据块

我通常将它们放在index.php的开头/结尾,然后包含()内容页。这似乎是一个强健的解决方案,因为您可以保证会话已启动,并且在内容发布后将被清理。

如果您希望项目在逻辑上组织良好,则不需要在代码中进行会话管理。。事实上,如果您的代码组织得很好,您甚至可以将其几乎放在流程的末尾,如果您不想在它前面回送任何类型的字符串的话


就个人而言,我更喜欢将会话和ob视为不同的库(由我自己用php创建,以我的方式处理),并认为这是最好的解决方案。但这取决于您想要实现什么。

在执行任何输出(包括但不限于发送头、cookie)的任何和所有代码之前,您需要使用session_start()因此,在页面加载过程中执行的第一个文件的顶部是一个安全的地方。

您可以使用一个实现为的文件,它在最初创建时调用
会话\u start
。然后对该会话对象执行任何进一步的会话操作


输出控制问题可以通过在索引脚本的开头调用
ob\u start
来解决。无需调用
ob\u end\u flush
,因为输出缓冲区会在脚本执行结束时自动刷新。

这可能不是您想要的,但只是一点提示:


我总是保持
性能不变,打开会话自动启动通常不是一个好主意。而且它不应该是你问题的解决方案,它更像是一个坏黑客。你可能还想看看这个网站,f.e.指出,在启动会话期间,浏览器缓存不工作:如果你有一个几乎所有脚本都启动会话()的网站,那么打开会话自动启动不会对性能造成影响。如果站点的一部分不使用会话,则可以使用“自动预结束”在每个脚本之前包含文件,以确定运行的脚本是否应该启动会话,如果应该,则执行“启动会话()。
<?php
class foo {
    //...
}

//EOF