Php 会话只在99%的时间有效

Php 会话只在99%的时间有效,php,session,Php,Session,我又在尝试一个困扰我多年的问题。我和其他人一样,为登录用户使用会话。对于新用户,我创建一个新的db条目,然后检索新创建的UserID键,对于现有用户,我从表中检索该键。在任何一种情况下,我都会捕获读/写错误,以便在进入下一个代码部分时知道已设置了$UserID。这很简单: if (!isset($_SESSION)) { session_start(); } $_SESSION['User'] = $UserID; /* Proceed to next page */ 当我进入下一页

我又在尝试一个困扰我多年的问题。我和其他人一样,为登录用户使用会话。对于新用户,我创建一个新的db条目,然后检索新创建的UserID键,对于现有用户,我从表中检索该键。在任何一种情况下,我都会捕获读/写错误,以便在进入下一个代码部分时知道已设置了$UserID。这很简单:

if (!isset($_SESSION)) {
    session_start();
}
$_SESSION['User'] = $UserID;

/* Proceed to next page */
当我进入下一页时,我做的第一件事是:

if (! isset($_SESSION)) session_start();
if (! isset($_SESSION['UserID'])) kickoutTo("SessionCheck.php");
让我发疯的是,可能有1%的时间,我会被重定向。(SessionCheck.php是我专门为这个问题制作的一个页面,用来收集这些不幸用户的反馈。)

现在我只能想象不创建会话的两个原因:

  • 他们不接受饼干
  • 驱动器上的写入问题不会创建临时文件
  • 所以我的catch页面写了一个测试cookie,然后在后续页面上读取它。绝大多数人接受它们没有问题。(而那些被告知的人也会被告知)所以我认为问题不在于接受cookies。(除非浏览器有某种只拒绝sessionid的方式?我不知道,只是随口说说而已。)

    对于第二个问题,如果驱动器不能写,我相信它会立刻给每个人带来一大堆问题。这些年来,当备份过程出错时,我曾有过一两次这样的经历;我只是对主人大喊大叫,事情就解决了

    所以我无法解释为什么大多数人没有问题,但只有少数人有问题。例如,我登录自己的网站数千次,但从未体验过。但我从做这件事的人那里得到了成百上千的日志。他们都使用不同的浏览器和操作系统。他们在世界各地的IP上。它可以一次发生一次,也可以成批发生。大多数错误来自新用户,但并不总是如此

    以下是我在phpinfo中的会话设置:

    Session Support enabled
    Registered save handlers    files user sqlite
    Registered serializer handlers  php php_binary
    
    Directive   Local Value Master Value
    session.auto_start  Off 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  10000   10000
    session.gc_maxlifetime  18000   18000
    session.gc_probability  1   1
    session.hash_bits_per_character 4   4
    session.hash_function   0   0
    session.name    PHPSESSID   PHPSESSID
    session.referer_check   no value    no value
    session.save_handler    files   files
    session.save_path   /tmp    /tmp
    session.serialize_handler   php php
    session.use_cookies On  On
    session.use_only_cookies    On  On
    session.use_trans_sid   0   0
    

    这是怎么回事?我在哪里看?我可以测试什么?这已经发生了很多年,在这期间,我甚至在同一家主机公司内更换了服务器。非常感谢您的解答。

    也许他们会打开页面,让它停留30分钟,然后单击一个链接,因为会话已过期而被重定向到登录页面。用户通常不理解,如果您只是让页面处于静止状态而不进行导航,会话将过期。缓存过期设置为3小时。。。会话缓存在3小时后无效,因此它们将被引导出去。更改php.ini中的值并重新启动apache/fpm。我也会每隔8小时进行垃圾清理,并在6小时后手动要求登录,但这不是需要过期的成功会话的问题。它在没有用户交互的情况下立即发生。登录页面处理它们,然后直接重定向到无法识别其会话的欢迎页面。相隔一秒。所以我会提高缓存时间,但我不认为这是相关的。