【问题标题】:PHP + Session data being lostPHP + Session 数据丢失
【发布时间】:2011-06-27 19:59:20
【问题描述】:

我面临着非常奇怪的问题。我有一个基于会话的搜索引擎。

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

这里是 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

您对如何调试此问题有任何想法吗?

【问题讨论】:

  • 我会说如果会话工作两次,那么您的设置就可以了。您是否考虑过审查您的代码?
  • 我能想到的唯一原因是您没有开始会话。尝试使用 var_dump 或 print_r 您的会话变量,看看它们在哪里丢失。最近,我刚遇到这样的事情,果然我没有开始我的会话。
  • 除了 php.ini 设置,你应该确保你在你的代码中启动了 sesison(例如 session_start() 在你的 php 页面的最开始,但我想这已经完成了)。重新加载页面时是否从 http 重定向到 https - 因为这是会话丢失的情况?
  • @hornetbzz 会话已正确启动。这是带有分页的简单脚本。不知道发生了什么。

标签: php session session-variables


【解决方案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;

【讨论】:

    【解决方案2】:

    如果您致电 session_unset('key1')$_SESSION['key1'] 不存在,您将丢失所有数据 解决方案:

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

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      相关资源
      最近更新 更多