我面临着非常奇怪的问题。我有一个基于会话的搜索引擎。
由于未知原因,第三页重新加载后会话变量将丢失。
这是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 :(得分:1)
首先,我会检查是否有重定向到https,因为这是session loss的情况。
我确保在重定向后有一个 exit(); 。
我还会尝试在php.ini中关闭* session.auto_start *并在代码中启动会话,并将该会话cookie放入/ tmp目录i / o /var/lib/php5。
然后我会先用简单的 var dump 查看各个代码点的$ _SESSION数据。
最后,你可以使用 inotify 组合2个文件研究来跟踪会话文件的变化:一个查看会话cookie,另一个查看你的php代码,你可以检查两个并排。
对于debian发行版,假设您在战略点的PHP代码中的目录/ cookie中创建一个临时文件,并且您的会话cookie在您的tmp目录中被激活:
# 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;
答案 1 :(得分:0)
如果您拨打session_unset('key1')
并且$_SESSION['key1']
不存在,则会丢失所有数据
溶液:
if(isset($_SESSION['key1']){
session_unset['key1'];
}