【问题标题】:PHP session values not set未设置 PHP 会话值
【发布时间】:2011-06-07 18:45:52
【问题描述】:

我在声称未设置 PHP 会话变量时遇到了一些奇怪的问题。我只在一种特殊情况下遇到这种情况:

我的网站有一个 3 步向导,我使用会话来存储用户在每个步骤中的选择。为了启动向导,我使用了一个 init 脚本来确保清除所有旧的向导会话数据 - 然后这个 init 脚本将用户重定向到第 1 步。例如:

// Initialize wizard session and send user to step 1
$_SESSION['wizard'] = array();
$_SESSION['wizard']['step1'] = TRUE;
session_write_close();
header('Location: http://mysite.com/wizard/step1.php');

然后在 step1.php 的顶部,我进行如下检查:

if (!isset($_SESSION['wizard']['step1'])) 
    throw new Exception('Step1 not initialized');

当用户提交 step1 表单时,它会被发回给自己进行验证。如果通过,则再次重定向到第 2 步。

大多数时候,这工作正常。事实上,init 脚本始终有效,并且 step1 表单始终加载没有问题。但有时,在提交第 1 步表单后,会引发“第 1 步未初始化”异常。我看不到初始负载如何通过检查,但表单发布稍后会失败。特别是考虑到这个问题很少发生,而且大多数时候根本没有问题。

我正在使用数据库来存储我的会话数据,但我不认为这是由于会话超时或垃圾收集 - 一些相关的 php.ini 值:

session.use_cookies = 1
session.cookie_lifetime = 0
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 86400

有谁知道是什么导致了这样的问题?任何见解将不胜感激。

谢谢,布赖恩

【问题讨论】:

  • 我注意到您发布了您的初始化程序,session_start(); 除外
  • 如果我找到会话 cookie,我会在每个脚本的顶部调用 session_start(),即。如果(isset($_COOKIE['PHPSESSID']))。也许这是不正确的?绝大多数情况下,事情都没有问题。我不知道为什么我不能故意复制它。
  • 您可以在您的问题中发布您的session_start() 代码吗?诊断和解决问题可能很重要。
  • 好的,在阅读this 帖子后,我刚刚删除了上面提到的 Cookie 检查。我们会看看我是否继续遇到问题。代码只是if (isset($_COOKIE['PHPSESSID'])) session_start();

标签: php session


【解决方案1】:

确保使用您的会话的每个脚本都以 session_start() 开头

【讨论】:

    【解决方案2】:

    如果不是整个会话都是空的,而只是那个变量/键,您可以使用它来跟踪原因:

    class foo extends ArrayObject{
        function __destruct(){
            echo 'dying:';
            debug_print_backtrace();
        }
    }
    session_start();
    $_SESSION['wizard'] = new foo();
    //array access is still possible
    $_SESSION['wizard']['foz'] = 1234;
    //reading it like an array also
    echo $_SESSION['wizard']['foz'];
    //on normal completion, it also gets called, the backtrace would be:
    //dying:#0  foo->__destruct()
    //^ ignore those
    
    //on overwriting / deleting values, like for instance this by accident:
    $_SESSION['wizard'] = array();
    //the backtrace is something like:
    //dying:#0  foo->__destruct() called at [filename:linenumber]
    

    ... 你会有一个文件名+行号 可能将其写入临时文件而不是回显它以确保您不会错过重定向等内容。

    【讨论】:

    • 已验证这不是 session_start() 问题。仍然不确定发生了什么,但这是继续排除故障的明智建议。
    【解决方案3】:

    您是否记得在与$_SESSION 交互之前以及在任何输出发送到浏览器之前调用session_start()(包括<?php 之前的任何空白或空白行?

    【讨论】:

    • 是的,它在顶部被调用。我将三重检查空白问题 - 但如果这些是原因,它不会每次都中断并且不那么频繁吗?我不会收到 PHP 警告吗?
    • @Brian 是的,你会收到警告 - 我错过了“不经常”部分
    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 2013-10-18
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多