我不得不将我太复杂的项目(大约100个文件)分解为小文件。一个问题是,仍然很难看到逻辑,得到很好的会话错误堆:
`Cannot send session cookie - headers already sent by`
如何管理会话命令,例如“session-start”和“ob-end-flush”?您是将它们添加到index.php的开头和结尾还是有一些集中文件来管理它们?
请每个答案都有一个拇指规则。
答案 0 :(得分:3)
这可能不是你要求的,但只是一点点暗示:
我总是将<?php
标记保持打开状态:
<?php
class foo {
//...
}
//EOF
这样你就不会在?>
之后有任何换行符(会话开始之前的非预期输出),这很难追查。
Zend Framework也使用了这个约定。
答案 1 :(得分:2)
您需要在执行任何输出的任何代码(包括但不限于发送标头,Cookie)之前使用session_start(),以便在页面加载期间执行的第一个文件的顶部是安全的地方。
答案 2 :(得分:2)
您可以使用custom session handler实施为singleton,在session_start
初次创建时调用ob_start
。然后,对该会话对象执行任何进一步的会话操作。
输出controll问题可以通过在索引脚本开头调用ob_end_flush
来解决。不需要调用{{1}},因为在脚本执行结束时会自动刷新输出缓冲区。
答案 3 :(得分:1)
也许您可以使用会话自动启动来确保在任何输出之前启动会话?
http://us.php.net/manual/en/session.configuration.php#ini.session.auto-start
答案 4 :(得分:1)
我通常将它们放在index.php的开头/结尾,然后包含()内容页面。这似乎是一个强大的解决方案,因为您可以保证您的会话已启动,并将在内容之后进行清理。
答案 5 :(得分:0)
所有这些错误通常意味着你已经输出了一些东西。我总是这样做的方法是使用一些模板引擎来帮助我记住在我做完其他所有事情之后只在一个地方发送输出。我使用了smarty,但还有很多其他的。
答案 6 :(得分:0)
使用某种响应对象来汇总您的数据/标题。
这使您可以确保可以同时发送所有标题,并仅在必要时启动会话等。
赞成
缺点
答案 7 :(得分:0)
如果您希望您的项目在逻辑上组织良好,会话管理不需要在代码的开头。实际上,如果您的代码组织良好,您甚至可以将它放在最后如果你不想在它之前回应任何类型的字符串,那么这个过程。
就个人而言,我更喜欢将session和ob视为不同的库(由我自己在php中创建以便按我的方式处理),并认为这是最好的解决方案。但这取决于你想要实现的目标。