【问题标题】:PHP session_start() fails to create sessionPHP session_start() 无法创建会话
【发布时间】:2010-10-21 12:32:32
【问题描述】:

这些是我在 index.php 中的前 5 行:

  <?php
session_start();
if (!isset($_SESSION['cart'])) $_SESSION['cart']='';
$page = $_GET['page'];
?>

等等.. 我正在通过 firefox->firebug->firecookie 插件查看会话,并且没有创建会话。(我确信这一点,因为昨天工作的购物车今天不能工作。) 任何想法为什么会发生这种情况以及如何解决它?

我在启用错误时发现了这一点: 警告:session_start() [function.session-start]:无法发送会话 cookie - 标头已由 /home/controll/public_html 中的(输出开始于 /home/controll/public_html/metalkonsult.com/index.php:1)发送/metalkonsult.com/index.php 在第 2 行

我进一步探索 - 一些东西被发送到浏览器,但我不知道它来自哪里。我做了一个 var_dump(headers_list());在第一行,这就是我得到的:

array(2) { [0]=> string(23) "X-Powered-By: PHP/5.2.6" [1]=> string(23) "Content-type: text/html" }

如何关闭此功能?是什么寄来的?

我设置 session.auto_start = 1 在网站文件夹中的 php.ini 中 会议现在工作.. 不知道是什么原因造成的,但问题暂时解决了

【问题讨论】:

    标签: php session


    【解决方案1】:

    如果我在您的 php 开始标记 (

    您可以使用 firebug 检查确切的输出,方法是转到 net 选项卡,找到您的 PHP 文件传输,展开它,然后查看 Response 选项卡。您可以在 session_start 之后打印并查看它出现的位置......它应该是第一件事。

    否则,如果您有指向日志的 php 错误,请查看日志是否有任何内容。最后,确保浏览器也显示会话 cookie:有些浏览器不显示它们。

    【讨论】:

    • 您检查过 BOM 和自动前置吗?
    • 据我所知,这几乎就是答案。您是否使用过不同的文本编辑器,转换了文件编码之类的东西?当您说&lt;?php 位于字节 0 时,您是如何检查的呢?
    • 我一直在使用我创建它的同一个编辑器。如果这是问题,我该如何解决这个问题?
    • @DreamWave:这些是标准的 PHP 标头,它们没问题。您必须查看错误中提到的文件上的内容!
    • @DreamWave 快速检查一下:在 UltraEdit Unicode settings 下的 Advanced -> Configuration -> File Handling -> Save 中,是否检查了保存 UTF-8 BOM 的设置?
    【解决方案2】:

    首先将某些内容发送到浏览器,从而导致发送标头。检查您的代码以确保您的 PHP 代码之前没有一个空格。

    【讨论】:

    • 什么都没有 - 正如我所说 - 这些是我的 index.php 文件的前 5 行
    • 肯定有东西被发送到浏览器。如果你调用这个 echo (headers_sent()) 会发生什么?'sent':'not sent';就在你调用 session_start();
    • 我收到“已发送” .. 我如何检查发送的内容?
    • 如果您暂时用一个表示&lt;?php echo (headers_sent())?'sent':'not sent'; ?&gt;的简单文件替换当前存在的 index.php 怎么办?你得到同样的结果吗?还是说“未发送”?
    • 我不确定但 ob_clean() 可能会清理输出缓冲区,请在 session_start() 之前尝试使用它;
    【解决方案3】:

    一些编辑器在文件开头添加了一个不可见的 UTF-8 字节顺序标记。根据不同的服务器软件版本,它可能会或可能不会发送到浏览器。您能否检查源代码的十六进制转储并确保前 5 个字节是 3c 3f 70 68 70

    【讨论】:

    • 你如何检查并修复它?
    【解决方案4】:

    为我工作。确保您的服务器对保存会话数据的文件夹具有写入权限(检查您的会话路径:http://php.net/manual/en/function.session-save-path.php

          <?php
        session_start();
        $_SESSION['cart'] = "test<br />";
        print $_SESSION['cart'];
        if (!isset($_SESSION['cart'])) $_SESSION['cart']='';
        print $_SESSION['cart'];
    //blank it out
        if (isset($_SESSION['cart'])) $_SESSION['cart']='';
        print $_SESSION['cart'];
        ?>
    

    输出

    test
    test
    

    @Palantir:空格无关紧要。

    【讨论】:

    • 这可能取决于 PHP 版本,因为现代人通常会检测到此类问题并切断空白区域。 php 关闭后的尾随空格也是如此。但是你知道,当发生不好的事情时,最好消除所有可能的原因......出于同样的原因,我尽可能不使用 php 关闭标签:为什么要让自己陷入困境?
    • 它是在一个使用了 6 年的 PHP 4 机器上测试的。
    • 如果输出缓冲打开不会造成任何问题,这取决于配置。
    【解决方案5】:

    这是第一个调用的 PHP 页面还是从另一个页面中包含的?

    如果是第一个,请尝试在 php.ini 上启用 output_buffering。然后您可以通过调用ob_get_contents()查看之前发送的内容

    【讨论】:

      【解决方案6】:

      这个问题是由两个不同的原因引起的:

      1- 文件开头有一个空行,表示 php 5.2 推送 'headers already sent' 警告。

      http://board.phpbuilder.com/showthread.php?10310794-RESOLVED-Warning-session_start()-Cannot-send-session-cookie-headers-already-sent

      如果

      2- PHP output_buffering 默认关闭。 如果您使用共享主机并且代码在 localhost 上运行,这可能就是原因。 只需在 php.ini 或本地 .user.ini 中设置这些参数

      output_buffering=4096

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 2017-05-20
        • 2012-08-01
        • 2017-10-05
        • 2012-01-27
        • 2015-06-29
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多