【问题标题】:PHP Sessions - WarningsPHP 会话 - 警告
【发布时间】:2009-08-04 09:56:10
【问题描述】:

我昨天问了“php 警告 - 服务器移动后已发送标头”的问题,我已经做出了更改,试图解决问题,但我仍然没有得到它!

我正在编写由另一家公司编写的代码!我没有将站点从他们的服务器上移出并将其放在我们的服务器上,但我的问题是会话无法跨新服务器上的页面工作!

我收到警告:

警告:session_start() [function.session-start]:无法发送会话 缓存限制器 - 标头已发送(输出开始于 /home/com10002/public_html/bank/index.php:28) 在 /home/com10002/public_html/bank/includes/quickform.php 在第 3 行

在我的 index.php 中

include('includes/functions.php');

$activeTab = "navhome"; 
$sent = false;

$title = (isset($_GET['title']))? mysql_real_escape_string($_GET['title']) : 'Home';    
$title = str_replace('-',' ', $title);

if($title != '') {  

    $sql = "SELECT * 
            FROM contents 
            WHERE name LIKE '%$title%'
            LIMIT 1";

    $result = @mysql_query($sql);       
    $row = mysql_fetch_assoc($result);      
}

//Set page title
$pagetitle = (isset($row['name']) && $title != 'Home')? ucwords($row['name']) : "Bank Charges";

HTML..HEAD..元数据和标题标签..ECT

include('includes/header.php');

    <div class="textarea">
        <?php include('includes/rightcol.php'); ?>
        <div id="contentvideo" style="display:none;"></div>
        <h1><?=$row['h1'];?></h1>
        <h2><?=$row['h2'];?></h2>
        <?=$row['intro'];?> 

        <?php  include('includes/quickform.php');?>

        <?=$row['page_content'];?>          
    </div>

    <?php include('includes/subnav.php'); ?>    

在 quickform.php 中

if($_POST) {
    session_start();
    $error = false; 
    $captcha = false;
    $sent = false;
etc.......

这是他们的代码,目前在他们的服务器上运行良好!

1) 我尝试将session_start() 移动到index.php 的顶部 2)在两个页面上都放置一个会话。 3) 删除会话前的空白,当它在 index.php 中时

我的新版本是网站www.compensation-claims.org/bank

因为这不是我的代码,我不确定他们为什么将会话放在 quickform.php 中

【问题讨论】:

    标签: php session cookies


    【解决方案1】:

    一个快速而肮脏的修复方法是在你的服务器上激活output_buffering,方法是修改你的php.ini文件(并重新启动Apache),设置如下:

    output_buffering=4096
    

    您遇到的问题是,即使只发送了 1 个字符,也无法发送 HTTP 标头;通过使用该指令,您表明在缓冲 4k 数据之前不应发送任何内容。

    这通常足以缓冲出现在.php 文件开头/结尾处的一些空格,并且足以引起这种麻烦。

    注意:这是一个快速而简单的修复方法,但它可能会帮助您使应用程序正常工作。

    当然,最好的解决方案是删除在调用 session_start / 之前发送的任何类型的输出,或者将对 session_start 的调用移至 PHP 脚本的开始
    通常有帮助的一件事是删除 .php 文件末尾的结束 ?&gt; 标记,这样你就没有任何空格,因为它不再存在 (是的,这是完全有效的)


    再次查看给定代码后进行编辑:

    header.php

    • 您正在做一些输出(HTML 代码,例如 div“textarea”)
    • 然后,只有这样,您才使用session_start 开始会话
      • 由于一些输出已经发送到浏览器,session_start 无法创建 cookie,因此失败。

    所以,您确实需要将 session_start 移动到尽可能高的位置:但它就在 index.php 的开头,例如;或者,也许,在任何地方都可以得到它,在functions.php 的顶部...

    ...但绝对不在某些 HTML 输出的中间!

    (我之前所说的 output_buffering 可能是这个(不好的)代码之前工作的原因)

    这应该可以解决问题,我认为...
    无论如何,祝你好运!

    【讨论】:

    • 谢谢,但看起来我的主机不允许我编辑 php.ini 文件!
    • 哦,太糟糕了 :-( 也许使用 ob_start 之类的,然后?或者您可能必须遍历每个文件,删除不需要的空格,以及类似的东西 :-( 作为旁注:第 28 行的 index.php 中有什么内容?您可能想查看该行,因为它是导致输出的行,在这种特殊情况下;-) 仍然;一件事应该不太难尝试:移动session_start 尽可能“高”:它应该是第一件事完成的事情之一(所以,把它放在被调用页面的开头)
    • 我刚刚编辑了我的答案,以提供更多信息;以及可能解决您问题的方法:-)
    【解决方案2】:

    听起来像是一个 UNIX 字符返回被发送到浏览器,因为 Windows 处理回车的方式不同。在发送标头之前发送一个或多个字符将导致发生此错误。另一种选择可能是另一个服务器通过 php.ini 指令启用了输出缓冲,该指令在将任何输出发送到客户端之前捕获和解析任何输出。这可能是出于压缩原因的情况。我建议比较 php.ini 配置并查看在移动之前是否在 Apache 服务器上启用了 gzip 压缩。

    【讨论】:

      【解决方案3】:

      您可以在脚本中使用 ini_set() 函数来设置 php.ini 配置值。

      ini_set('output_buffering', 4096);
      

      【讨论】:

        猜你喜欢
        • 2012-12-23
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 2014-10-29
        • 2011-05-28
        • 1970-01-01
        相关资源
        最近更新 更多