omg*_*omg 8 php session ob-start
我不认为这是合理的.
为什么它实际上是这样的规则?
Pas*_*TIN 13
在" 正常情况 "中,我认为不必ob_start在此之前调用session_start- 也不是其他方式.
尽管如此,引用手册页session_start:
当启用trans-sid时,session_start()将注册内部输出处理程序以进行URL重写.如果用户使用ob_gzhandler或类似ob_start(),则输出处理程序的顺序对于正确输出很重要.例如,用户必须在会话开始之前注册ob_gzhandler.
但这是一种特殊情况:在这里,输出处理程序的顺序很重要:如果你想让一个处理程序修改另一个处理程序,它们必须以"正确"的顺序执行.
通常,如果你不使用那种处理程序(例如Apache并且mod_deflate在压缩输出方面做得很好),唯一重要的是在调用之前不得发送标题session_start (因为,取决于您的配置,session_start发送cookie,它们作为HTTP头传递).
一旦必须发送任何数据,就会发送标题 - 即,只要有任何输出,甚至<?php ?>标记之外的一个空格:
注意:如果您使用基于cookie的会话,则必须在将任何内容输出到浏览器之前调用session_start().
ob_start 表示PHP必须缓冲数据:
此功能将打开输出缓冲.当输出缓冲处于活动状态时,不会从脚本(标头除外)发送输出,而是将输出存储在内部缓冲区中.
这样,在您实际说" 发送数据 " 之前,不会发送输出.这意味着标题不会立即发送 - 这意味着session_start可以稍后调用,即使应该有输出,如果ob_start没有使用过.
希望这会让事情变得更加清晰......
如果默认情况下你output_buffering是,Off并且你不幸发送一个字节的数据回到客户端,那么你的HTTP标题已经被发送.这有效地防止session_start()将cookie头传递回客户端.通过调用ob_start()启用缓冲,从而延迟发送http标头.