我正在使用会话,以尝试在Web应用程序中为我的用户实施永久登录。后端是通过Namecheap共享托管提供的php 7.2和apache。
我正在客户端上设置会话cookie,其“ cookie_lifetime”和“ gc_maxlifetime”为604,800秒(一周)。服务器使用这些参数调用session_start()
,并检查名为“ user_id”的$_SESSION
密钥以查看session_start()
调用是否已启动现有会话(如果定义了密钥,则用户将“登录”)。每次加载页面时都会执行此操作。一切正常,直到大约40分钟不活动为止,然后刷新下一页并尝试调用session_start()
并访问任何$_SESSION
键对所有内容返回未定义,尽管会话cookie几天仍显示“ Expires”值将来在DevTools中使用。
我的理解是,“ cookie_lifetime”,“ gc_maxlifetime”以及用于设置客户端Cookie的相关“ Expires”标头至少会将会话信息保留指定的时间,但是这种交互作用表明,无论我在这些字段中输入的内容,$_SESSION
超全局变量在不活动约40分钟后不会返回任何有意义的内容。
我不是正确理解了这一点,还是从服务器配置的角度来看可能出问题了,而这超出了客户端-服务器应用程序代码的范围?
我并没有完全了解为什么发生这种情况。我确实联系了Namecheap支持人员,他们告诉我他们的会议在大约40分钟后并没有以同样的方式出现故障。当他们尝试使用与我使用的相同的代码和配置来重新创建问题时,他们继续看到几个小时前设置的会话值。
我进入服务器配置并检查了 [支持人员曾说过,默认位置是phpinfo()
转储的输出,并确定Registered save handlers
设置为files user
。我无法确定其中的user
组件反映了什么,也许这就是问题所在,但是我was >>能够通过显式指定session.save_path
参数而不是依靠默认值来解决问题(在phpinfo输出中为no value
。)>/home/[user]/tmp/
,他们的会议在那儿显示,但我的不在。在将显式save_path
添加到php.ini之后,我的会话开始出现在此处,并且〜40分钟的到期时间不再发生。
如果其他人可以提供更多的见解/理解,我将拒绝接受这作为答案,但是我至少想说我已经找到了解决问题的办法。我不确定以前发生了什么,但是我在共享主机用户帐户的目录中的任何地方都找不到我的会话文件,我想知道它们是否在那里。它对支持人员有效,但对我或我在自己的计算机上对其进行过测试的朋友不起作用,这对我来说也很奇怪。