PHP会话在输出html后启动

PHP会话在输出html后启动,php,Php,我到处都读到,为了让会话正常工作,必须在输出任何html之前调用session\u start 例如,这个问题: 但是,此示例没有做到这一点,它可以工作: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Counting with the SES

我到处都读到,为了让会话正常工作,必须在输出任何html之前调用
session\u start

例如,这个问题:

但是,此示例没有做到这一点,它可以工作:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
  <title>Counting with the SESSION array</title>
</head>
<body>
<FORM action="counter-session.php" method="GET">
<INPUT type="submit" name="Count" value="Count">
<?php
   session_start();
   if (! isset($_SESSION['counter']))
      $count = 0;
   else
      $count = $_SESSION['counter'];
   $count = $count + 1;
   $_SESSION['counter'] = $count;
   echo "count is $count";
?>
</FORM>

</body>
</html>

使用会话数组计数
也就是说,计数器按预期递增。为什么


附加问题:一旦调用了
session\u destroy
,存储到
$\u session
中的任何进一步数据都不会被保存(即下次使用另一页的
$\u session
变量时,对
$\u session
的进一步更改不会被反映出来)这是真的吗?

我刚刚测试了它,情况确实来自输出缓冲


如果要检查它,只需添加
ob_end_flush()开始会话前。

检查ini设置。如果将其设置为类似于
on
或int值的值,则可以执行此类错误…我想您的意思是,这不是预期的行为?应该引用该词;)。我所说的“错误”是指有效地创建输出,然后发送标题。标题应在html输出之前发送。输出缓冲是一种根据服务器或主机而不同的设置(设置或不设置,以及缓冲区大小的变化),您不应该依赖它或明确地设置它。因此,在这种情况下,显然不需要发送头。无论您是否启动会话,系统都会使用完全相同的标题。请检查此怪物,并将输出缓冲视为解决方案章节什么会导致输出缓冲?我认为您必须使用
ob_start()
显式启用它。不过,我看到了Zimmi的评论,并检查了我的设置,并且打开了输出缓冲。