繁体   English   中英

了解缓存限制器 标头已发送php警告

[英]Understanding cache limiter | headers already sent php warning

我有一个运行良好的站点,但是仅通过刷新主页(index_3.php),我的错误日志中就会显示两个警告。

[08-Oct-2013 11:36:09] PHP Warning:  session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent (output started at /home2/mysite/public_html/mysubsite/index_3.php:7) in /home2/mysite/public_html/mysubsite/functions.php on line 12

[08-Oct-2013 11:36:09] PHP Warning:  session_regenerate_id() [<a href='function.session-regenerate-id'>function.session-regenerate-id</a>]: Cannot regenerate session id - headers already sent in /home2/mysite/public_html/mysubsite/functions.php on line 13

我已经进行了足够的研究,以了解在会话开始之前某些东西正在发送页面数据,但是我似乎无法根除原因。 直接从本教程站点的“创建PHP函数”中获取functions.php。 http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL

同样在index_3.php上加载的是get_opwire.php,它只是放置了一个表。 get_opwire.php的开头看起来像:

<?php
include 'db_connect.php';
include 'functions.php';
sec_session_start();

sec_session_start(); 是位于functions.php中的自定义会话开始

当我尝试将sec_session的顺序重新排列到顶部或将这些中断转移到表中断处时。 Index_3.php只是主页,主要是html,其中包括用于提交表单和get_opwire.php的页面。

有人可以帮我指出问题吗?

编辑:index_3.php(从第1行到)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=Windows-1252"/>
 <meta name="Generator" content="Xara HTML filter v.6.0.1.335"/>
 <meta name="XAR Files" content="index_htm_files/xr_files.txt"/>
 <title>index_3</title>
 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
 <link rel="stylesheet" type="text/css" href="index_htm_files/xr_main.css"/>
 <link rel="stylesheet" type="text/css" href="index_htm_files/xr_text.css"/>
 <link rel="stylesheet" type="text/css" href="index_htm_files/custom_styles.css"/>
 <script type="text/javascript" src="index_htm_files/roe.js"></script>
 <!--[if IE]><script type="text/javascript" src="index_htm_files/prs.js"></script><![endif]--><!--[if !IE]>--><script type="text/javascript" src="index_htm_files/prs3.js"></script><!--<![endif]-->
 <script type="text/javascript">var xr_nextpage=""; var xr_transition=0; var xr_transitiontime=0;var xr_prevpage="index_2.htm"; var xr_btransition=0; var xr_btransitiontime=500;</script>
 <style type="text/css">.xr_pbd {position: absolute; border:none; left: 50%; margin-left: -380px;}</style>
</head>

编辑2:index_3.php内的某处

<html>
<body>
<div style="width:  480px;  height:  175px;  overflow:  auto;">
<?php include 'get_opwire.php'; ?>
</div>
</body>
</html> 

尝试从所有包含的php文件中删除结束符?>标记。

会话开始和会话重新生成ID之前的某处正在页面上放置某些内容。 如果确定没有在页面上回显或打印任何内容,则可能是其中一个文件顶部的空白。

编辑1

一些文本编辑器/文字处理器会由于编码而在文件的顶部保存额外的不可见字符。 尝试在纯文本编辑器或建议用于编码的文本编辑器(例如Notepad ++)中将文件的文本复制并粘贴到新文件中。

编辑2

因此,这些是最可能的解决方案...。

output started at /home2/mysite/public_html/mysubsite/index_3.php:7

这意味着在index_3.php的第7行开始输出。 那里可能有一个空格或某种错误,导致发送输出。

如果确实找不到该不可见的输出,则可以使用ob_start等进行缓冲以捕获所有输出。 在会话开始之前放置ob_start,稍后再使用ob_end_flush显示页面。 但这并不是您不知道发送输出的事实的真正解决方案。

编辑3:“无输出”包括所有HTML。

如果任何文件中的某些内容不在PHP括号<?php?>内,则该值有效。 您的index_3.php文件以HTML开头。 那是输出。 您必须先执行get_opwire.php。

编辑4

关于get_opwire.php如何同时具有页面起始内容和表格打印输出,这是一个为什么将显示代码与功能代码分开的好主意的示例。 您有三种选择:

  1. 有单独的文件。 您将在index_3.php的最顶部有一个包含page_start.php的文件,该文件确实包含和session_start,在该表的顶部有一个诸如display_table.php的文件,该文件显示了您的表。
  2. 将表转换为函数。 您可以将表输出包装在一个函数中,将get_opwire.php包含在index_3.php的最顶部,然后在需要该表的位置调用该函数。
  3. 使用输出缓冲。 输出缓冲可以捕获打印出来的内容,以便以后使用。 它会像这样:

index_3.php的顶部:

 ob_start();
 include get_opwire.php;
 $table = ob_get_contents();
 ob_end_clean();

表格的位置:

 echo $table; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM