session 仅在两个页面上出现缓存错误 - 所有其他页面都工作正常

session cache error only on two pages - All other pages are working fine

我从开发者那里开发了一个网站。我的网站运行良好。突然间,我发现每当我点击“联系我们”link 时,我都会收到一个错误

"Warning: session_start() Cannot send session cache limiter - heards already sent (output started at /home/xxx/public_html/contact.php:1) in /home/xxx/public_html/connection/config.php on line 2"

这在以前是不会发生的。开发人员不支持我并且忽略我的电子邮件。于是在网上查了很多,发现是session_start()的定义方式有问题。

这里是contact.php

的代码
<?php
  include("connection/config.php");
  session_start();
?>
<?php
  if(isset($_POST['enquiry2']))
  {
    .
    .
    .
  }
?>
<!DOCTYPE html PUBLIC
.
.
.
  <?php include "footer.php"; ?>
</html>

代码config.php

<?php 
session_start();
error_reporting(0);

if ($_SERVER['HTTP_HOST'] == 'localhost' || $_SERVER['HTTP_HOST'] == '192.168.1.111')
  {
    $con=
    .
    .
    }
  else
    {
      $con=
      .
      .
    }
error_reporting(E_NOTICE ^ E_WARNING ^ E_ALL);
require_once("logic/class.config.php");
.
.
<?php date_default_timezone_set("Asia/Kolkata");?>

在很多文章中,我读到 session_start() 应该在页面顶部,所以我颠倒了 contact.php 的第二行和第三行,但它给了我同样的错误指向contact.php 文件。

"Warning: session_start() Cannot send session cache limiter - heards already sent (output started at /home/xxx/public_html/contact.php:1) in /home/xxx/public_html/connection/contact.php on line 2"

早些时候它指向 config.php 文件

注册页面也发生了同样的事情。我有三个文件 register.php、register1.php 和 register2.php。同样的错误仅在 register3.php 加载页面时发生,并在单击提交按钮时再次发生。

我请求是否有人可以帮助我确定问题。

谢谢。

编辑

如 Premalatha 所建议:

从 contact.php 中删除了 session_start(); -> 但警告相同。

include("connection/config.php"); 之上放置 session_start(); -> 但警告相同。

根据 Alok 的建议:

我不知道如何检查我是否正在发送内容或在 session_start() 之前的某处调用 header。 session_start() 行要么在顶部,要么在第二行,第一行是 include("connection/config.php");,我试图在没有帮助的情况下颠倒交换。

一件事我不明白其他 .php 文件也有相同的编码那么为什么这个警告只出现在 contact.php 上?同样,register1.php、register2.php也有相同的编码,但为什么只有在加载和卸载时才会出现警告register3.php。之前一切正常,这突然开始,我不记得对这些文件中的任何一个进行过任何更改,所以问题可能出在其他地方。我也想尝试 wangpeng 的建议,但我在 cpanel 的任何地方都找不到 php.ini 文件。此外,我没有弄清楚如何检查文件的代码是否为 UTF8-BOM。另外我应该把 OB_START() 放在哪里,因为我无法确定 header 在哪里。

EDIT2

顺便说一句,此警告不会影响网站的功能。错误只是出现然后消失。但是,它扰乱了css,所有的字体和图像都变大了,页面看起来要折腾了。谁能告诉我如何忽略这个错误,让系统完全不显示它?

Headers already sent表示PHP脚本已经将headers发送到服务器,现在无法修改。

这意味着在 session_start() 之前您的脚本必须向服务器发送内容或调用 header 并且在发送之后脚本正在调用 session_start() 函数试图修改 headers。

您的解决方案是检查您没有发送内容或在两个脚本中 session_start() 之前的某个地方调用 header


更新:

试试这个,

找到*.php中指向contact.php的所有文件,找到session_start();在里面。

将其替换为以下内容,

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

以上代码将确保您不会再次启动 session(如果它已经启动)。

session_start(); 已包含在 config.php 文件中。 您可以在 contact.php 文件中删除,它将开始正常工作。

如果您仍然遇到任何问题,那么您可以放置​​ session_start(); include 语句上方 contact.php 中的代码行。

1.php.ini session.auto_start = 0 到 session.auto_start = 1 。 2.check文件编码是UTF8-BOM?是的,UTF8-BOM 到 UTF8。 3.OB_START();在header

之前

没想到解决方案会是这样!

然而,当我从四个不同的人那里读到同样的东西时,我不得不尝试这个并且它起作用了!我的包含文件中几乎没有前导、尾随和空白 space。我摆脱了它们,我的问题就解决了。

这是对我帮助很大的文章 Troubleshooting "Warning: session_start(): Cannot send session cache limiter - headers already sent"

如果包含文件中的 php 标记(或 html 或任何输出)后有空白 space,则会出现此错误。 -来自 Imdad

出现此问题的原因有 99% 可能是在您的包含文件末尾尾随 spaces(是的 - 我知道这听起来不太可能,但请尝试一下)。删除尾随的 spaces、换行符等...一切都会好起来的。 -克里斯 B

一个白色-space before <?php 也发送输出并出现错误。结论:在调用 session_start() 或 header() 函数之前不要输出任何字符,即使是 white-space 或换行符 -by Biswadeep Sarkar

对于可能 运行 跨越此的其他人 - 如果有人不小心留下了 php 包含文件的尾随 space,也会发生这种情况。示例:

   <?php 
    require_once('mylib.php');
    session_start();
 ?>

在上面的例子中,如果 mylib.php 在结束 ?> 标签后有空白 spaces,这将导致错误。如果您有 included/required 个文件,这显然会很烦人。幸运的是,该错误告诉您哪个文件有问题。 -罗斯