PHP session_start()无法创建会话

时间:2010-10-21 12:32:32

标签: php session

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

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

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

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

我进一步探讨了 - 发送到浏览器的东西,但我不知道它的来源。我做了一个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中 会议现在工作.. 不知道造成问题的原因,但问题暂时得到解决

6 个答案:

答案 0 :(得分:8)

如果我在你的php开始标记(&lt;?php)之前看到的空格也在源代码中,那么这就是原因:)确保在session_start调用之前没有输出。

您可以使用firebug检查确切的输出,方法是转到网络选项卡,找到PHP文件传输,展开它,然后查看响应选项卡。你可以在session_start之后放一个打印件,看看它出现在哪里......它应该是第一件事。

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

答案 1 :(得分:5)

首先会向浏览器发送一些导致标题发送的内容。检查代码以确保PHP代码之前没有一个空格。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

适合我。确保您的服务器具有保存会话数据的文件夹的写入权限(检查您的会话路径: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:空白并不重要。

答案 4 :(得分:1)

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

如果是第一个,请尝试在php.ini上启用output_buffering。然后,您可以通过致电ob_get_contents()

查看之前发送的内容

答案 5 :(得分:0)

我遇到了两个不同的问题:

1-在文件开头有一个空行的情况下,php 5.2推送已经发送的标题&#39;警告。

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

  

如果&lt; ?php位于脚本的第2行,然后是空白行   这可能会导致php标头功能无法正常工作等问题。

2- PHP output_buffering默认关闭。 如果你正在使用共享主机和代码在localhost上工作,也许这就是原因。 只需在php.ini或local .user.ini

中设置这些参数即可

output_buffering = 4096