【问题标题】:PHP headers already sent error [duplicate]PHP标头已发送错误[重复]
【发布时间】:2009-12-12 01:58:43
【问题描述】:

我得到了一个
警告:session_start() [function.session-start]:无法发送会话缓存限制器 - 标头已发送

即使我的文件的第一行看起来像这样也会出错:

<?php session_start();  

我在其他网站上看到的所有答案都说是在开始会话之前向服务器发送信息。为什么会出现此错误?

【问题讨论】:

  • 您是否在php.ini.htaccess 中配置了auto_prepend_file
  • 您是否将此文件包含在其他文件中?
  • 没错!我正在调用这个文件来处理由另一个 php 文件创建的表单。如果我不使用 session_start() 我应该如何开始/继续会话,或者访问这些会话变量?
  • 然后你应该在包含这个文件的文件的顶部运行 session_start() 。 session_start() 不必在每个文件中运行,只需在任何输出发送到浏览器之前运行一次。
  • 从辅助文件中删除了 session_start,现在得到通知:未定义变量:_SESSION 错误

标签: php session


【解决方案1】:

使用十六进制编辑器检查&lt;?php session_start(); 之前是否有不可见字符。如果您将文件转换为 UTF-8,那么许多编辑器会在开头插入 BOM 字符,这些字符在您的编辑器中不可见,但在十六进制编辑器中会显示。

【讨论】:

    【解决方案2】:

    如前所述,当信息为echo()'d、print()'d 或以其他方式发送到网络浏览器时,会导致此错误。您提到 session_start() 在包含的文件中。父/包含文件看起来像这样吗?

    <?php
      // Some processing code, etc.
    ?>
    <html>
    <body>
    Hello here's some content
    <?php include('session_starter.php');
    </body>
    </html>
    

    在 php.ini 中或通过父/包含文件顶部的 ob_start() 打开输出缓冲将解决此问题。

    另外,检查父 php 文件中的尾随/前导换行符:

     <- There's a newline here, so output has started
    <?php
     // Do some stuff
    ?> <- Newline here, output has started
    <?php
     include('session_starter.php');
    ?>
    

    【讨论】:

    • ob_start() 工作了,谢谢伙计
    【解决方案3】:

    解决所有这些问题的最简单方法是启用output buffering

    在 php.ini 中将 output_buffering 的值设置为 On

    output_buffering = On 
    

    【讨论】:

    • 为什么这个默认是'off'?
    • 保留缓冲区而不是立即发送可能会带来一些小的性能损失。
    猜你喜欢
    • 2013-05-03
    • 2011-04-17
    • 2011-07-04
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2022-01-06
    相关资源
    最近更新 更多