我有一些奇怪的问题,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步表单后,会抛出'Step1 not initialized'异常。我没有看到初始加载如何通过检查但是表单文章稍后失败了。特别是考虑到这个问题很少发生,而且大部分时间都没有问题。
我正在使用数据库来存储我的会话数据而我认为这是由于会话超时或垃圾收集 - 一些相关的php.ini值:
session.use_cookies = 1
session.cookie_lifetime = 0
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 86400
有谁知道可能导致这样的问题?任何见解将不胜感激。
谢谢,Brian
答案 0 :(得分:3)
确保使用会话的每个脚本都以session_start()
开头答案 1 :(得分:1)
您是否记得在与session_start()
交互之前以及在将任何输出发送到浏览器之前(包括$_SESSION
之前的任何空格或空行之前调用<?php
?
答案 2 :(得分:1)
如果不是整个会话都是空的,只是那个变量/键,你可以用它来跟踪原因:
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]
...你将有一个文件名+亚麻 可能会将其写入临时文件,而不是回应它以确保您不会错过重定向等内容。