【问题标题】:Troubleshooting "Cannot send session cache limiter - headers already sent"疑难解答“无法发送会话缓存限制器 - 标头已发送”
【发布时间】:2011-04-13 20:52:29
【问题描述】:

我在一个网站上实现了一个联系表单,它利用 php 和 phpmailer 类通过我的主机 smtp 服务器发送邮件。

当我提交表单时,我收到以下错误消息:

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

这是我正在使用的完整代码页面...

<?php
session_start();

    $name = trim($_POST['name']);
    $email = $_POST['email'];
    $comments = $_POST['comments'];
    $captcha = $_POST['captcha'];

    $site_owners_email = 'myemail.com'; 
    $site_owners_name = 'my name'; 

    if (strlen($name) < 2) {
        $error['name'] = "Please enter your name";  
    }

    if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $email)) {
        $error['email'] = "Please enter a valid email address"; 
    }

    if (strlen($comments) < 3) {
        $error['comments'] = "Please leave a comment";
    }

    if (int($captcha) !== ($_SESSION['randomnr2'])) { 
        $error['captcha'] = "CAPTCHA error. Please try again";
    }

    if (!$error) {

        require_once('phpMailer/class.phpmailer.php');
        $mail = new PHPMailer();

        $mail->From = $email;
        $mail->FromName = $name;
        $mail->Subject = "Contact Form";
        $mail->AddAddress($site_owners_email, $site_owners_name);
        $mail->Body = $comments;

        // Mail Server Settings

        $mail->Mailer = "smtp";
        $mail->Host = "myhost.com";
        $mail->Port = "25"; 
        $mail->SMTPSecure = "tls"; 
        $mail->SMTPAuth = true; 
        $mail->Username = "myname.com"; 
        $mail->Password = "mypassword"; 

        $mail->Send();

        echo "<li class='success'> Thank you " . $name . ". We've received your email. We'll be in touch with you as soon as we possibly can! </li>";

    } # end if no error
    else {

        $response = (isset($error['name'])) ? "<li>" . $error['name'] . "</li> \n" : null;
        $response .= (isset($error['email'])) ? "<li>" . $error['email'] . "</li> \n" : null;
        $response .= (isset($error['comments'])) ? "<li>" . $error['comments'] . "</li>" : null;
        $response .= (isset($error['captcha'])) ? "<li>" . $error['captcha'] . "</li>" : null;

        echo $response;
    } # end if there was an error sending
?>

表单 工作,所以 php 在大多数情况下都很好。我通过表单发送消息,然后在收件箱中收到消息。

【问题讨论】:

  • 发送输出时发送标题。任何时候你调用echo,或者你的php文件中出现&lt;?php ?&gt;标签之外的任何时候,都会发送输出。注意&lt;?php?&gt; 之前的任何空格。确保在调用 session_start 之前没有任何输出
  • 您正在使用 session_start() 在任何形式的输出到浏览器之后。
  • 我之前也遇到过这个问题,请参考我的回答
  • @Joe 这是我正在使用的代码 .... '
  • 哦,谢谢大家的快速回复:)

标签: php forms


【解决方案1】:

"Headers already sent" 表示您在调用 session_start() 之前已经完成了一些输出,session_start() 是一个修改标头的函数。这通常是因为第一个 php-tag 前面有一些空间,它算作输出。

【讨论】:

  • 感谢您的回复 :) 我已经尝试删除其中可能存在的任何空白,但没有帮助。
【解决方案2】:

如果您不想将 session_start() 放在脚本的开头,请考虑打开输出缓冲 (ob_start())。

【讨论】:

  • 感谢 judda - 这成功了。 :) 只有在我读到你的最后一句话'instead' 之后,我才终于接受并替换 session_start 为 ob_start。现在一切都很好:) 谢谢。
【解决方案3】:

这通常是由include()ed 文件末尾有一个新行引起的,例如:

<?php

?>
[[NEW LINE!]]

在调用session_start 之前,任何内容(甚至是空格)都不能输出到浏览器。

【讨论】:

    【解决方案4】:

    需要检查三件事:

    1. 按照其他人的建议,仔细检查文件开头或结尾处的空白
    2. 如果您的表单处理器已被另一个脚本包含,请检查包含它的脚本以确保该脚本上没有空格。
    3. 最后,打开一个十六进制编辑器并检查文件开头的字节顺序标记

    最后一个需要更多解释。

    文本编辑器有时会在使用 Unicode 编码的文件中添加 Byte Order Mark (BOM)。例如,UTF-8 BOM 是 ,并显示为文件中的前三个字符。它的目的是告诉程序读取多字节字符的顺序。在 UTF-8 中,它实际上很少需要,因为大多数 UTF-8 字符代码只有一个字节长。

    由于 BOM 旨在供程序使用,而不是直接供人类使用,因此大多数文本编辑器都会默默地抑制它。例如,程序 SciTE 有一个习惯,即在 UTF-8 编码的文本文件中添加 BOM,然后不显示。但它仍然存在,它会在您文件中的任何其他内容之前发送。

    这会触发您的 HEADERS SENT 警告。所以,加载一个十六进制编辑器。如果你在 Windows 上开发,你可以试试XVI32。在 Linux 上,尝试使用 shed(命令行)、ghex(gnome)或 hexedit(通用 X-Windows)。十六进制编辑器将向您显示确切的文件,包括可能存在的任何 BOM。

    【讨论】:

    • 谢谢您-将 session_start 替换为 ob_start 确实可以解决问题。我使用记事本++ 来编写我的代码,它有一些非常漂亮的功能来切换空白。不管我做了什么,错误一直存在,直到我 用 ob 替换了 会话。直到最近我一直在 session_start 之前添加 ob_start。一旦我完全删除了 session_start ...瞧!那是怎么回事?如果这不是空白问题,也不是编码 (BOM) 问题,那到底是什么?有人知道吗?
    • 顶部栏中有一个小菜单,标题为Encoding。确保您已正确设置。
    【解决方案5】:

    我遇到了同样的问题。我在顶部添加了这些行,它起作用了

    if($_REQUEST['callback']){
        header('Content-Type: application/javascript');
    }else{
        header('Content-Type: application/json');
    }
    

    【讨论】:

      【解决方案6】:

      通常当我们在回显或打印后发送标题时会出现此错误。如果此错误出现在特定页面上,请确保该页面在调用 start_session() 之前没有回显任何内容。

      不可预测的错误示例:

       <?php //a white-space before <?php also send for output and arise error
      session_start();
      session_regenerate_id();
      
      //your page content
      

      【讨论】:

        猜你喜欢
        • 2013-06-08
        • 2016-12-14
        • 2017-10-19
        • 2012-02-07
        • 1970-01-01
        • 2020-07-19
        • 2016-05-28
        相关资源
        最近更新 更多