2011-06-27 128 views
2

我正面临真正奇怪的问题。我有一个搜索引擎,基于会话。PHP +会话数据丢失

由于未知原因,会话变量在第三次页面重新加载后会丢失。

这里的PHP配置:

session.auto_start On Off 
session.bug_compat_42 On On 
session.bug_compat_warn On On 
session.cache_expire 180 180 
session.cache_limiter nocache nocache 
session.cookie_domain no value no value 
session.cookie_httponly Off Off 
session.cookie_lifetime 0 0 
session.cookie_path//
session.cookie_secure Off Off 
session.entropy_file no value no value 
session.entropy_length 0 0 
session.gc_divisor 100 100 
session.gc_maxlifetime 1440 1440 
session.gc_probability 1 0 
session.hash_bits_per_character 5 4 
session.hash_function 1 0 
session.name PHPSESSID PHPSESSID 
session.referer_check no value no value 
session.save_handler files files 
session.save_path /var/lib/php5 /var/lib/php5 
session.serialize_handler php php 
session.use_cookies On On 
session.use_only_cookies On Off 
session.use_trans_sid 0 0 

你有任何想法如何调试这个问题?

+0

我会说,如果会议工作两次,你的设置就可以了。你有没有考虑过审查你的代码? –

+2

我能想到的唯一原因是你没有开始会话。尝试使用var_dump或print_r您的会话变量,并查看它们丢失的位置。最近,我刚刚面对这样的事情,果然我没有开始我的会议。 –

+0

除了php.ini设置,你应该确保你在你的代码中启动了sesison(例如,在你的php页面开始的时候session_start(),但我想这是完成的)。重新加载页面时,您是否从http重定向到https - 因为这是会话丢失的情况? – hornetbzz

回答

1

起初,我会检查是否有重定向到HTTPS,因为这是session loss的情况下。

我会确保有一个出口();重定向后的

我也会尝试关闭php.ini中的* session.auto_start *并在代码中启动会话,并将该会话cookie放入/ tmp目录i/o/var/lib/php5中。

然后,我会首先看一下简单的var转储在不同代码点的$ _SESSION数据。

最后,您可以使用inotify跟踪会话文件更改,其中包括两个文件研究:一个查看会话cookie,另一个查看您的php代码,以便您可以并排查看。

对于Debian的发行版,假设你在关键点(S)和你的会话cookie在您的tmp目录strored你的PHP代码中创建目录/ cookie的临时文件:

# make sure the linux kernel > 2.6.13 and update it if not the case 
uname -a 
# install inotify 
aptitude install inotify-tools 
# run inotify in command line just before running your php code 
inotifywait -m -r --format '%f : %e' -e modify -e move -e create -e delete /tmp /cookie | while read line;do echo $(date '+%H:%M:%S') ;done; 
0

,如果你打电话session_unset('key1')$_SESSION['key1']不存在你失去了所有的数据 解决方案:

if(isset($_SESSION['key1']){ 
    session_unset['key1']; 
}