我们在cPanel LAMP共享托管服务器上有一个PHP应用程序(SilverStripe)。 CMS用户每隔几分钟就会丢失一次会话。以下是托管平台上基于phpinfo()
的一些会话设置:
session.gc_maxlifetime = 0
session.gc_divisor = 100
session.gc_probability = 1
session.save_handler = files
session.save_path = /tmp
session.cookie_lifetime = 0
PHP代码中没有会话管理。事实上,SilverStripe CMS实际上每5分钟对服务器进行一次ping操作,以使会话保持活动状态,但在此之前就会发生超时。
是什么导致这种情况?
答案 0 :(得分:1)
查看php.ini,为session.gc_maxlifetime
设置的值是以秒为单位的ID生存期。
我相信默认值是1440秒(24分钟)
http://www.php.net/manual/en/session.configuration.php
编辑:正如一些评论指出的那样,上述内容并不完全准确。这里有一个关于为什么以及如何实现会话生存期的精彩解释:
答案 1 :(得分:1)
内部案例CPANEL-12629已解决/ scripts / clean_user_php_sessions问题,其中在运行EasyApache 3的系统上始终删除超过24分钟的会话(尽管配置了自定义session.gc_maxlifetime值)。我将更新此主题,并提供有关此案例状态的更多信息。与此同时,临时解决方法是编辑以下文件:
代码:
/usr/local/cpanel/scripts/clean_user_php_sessions
Within the file, change this entry:
代码:
其他{ my $ dirs = Cpanel :: PHPINI :: get_directives(['session.save_path','session.max_lifetime'],1,'/ usr / local / lib'); clean_sessions($ dirs-> {'session.save_path'} {'value'},$ dirs-> {'sessions.max_lifetime'} {'value'}); }
返回1;
要:
代码:
其他{ my $ dirs = Cpanel :: PHPINI :: get_directives(['session.save_path','session.gc_maxlifetime'],1,'/ usr / local / lib'); clean_sessions($ dirs-> {'session.save_path'} {'value'},$ dirs-> {'session.gc_maxlifetime'} {'value'}); }
返回1;
然后,使用以下命令从cPanel更新中排除此文件:
代码:
echo '/usr/local/cpanel/scripts/clean_user_php_sessions' >> /etc/cpanelsync.exclude
在我们推出更新以解决问题后,请务必编辑“/etc/cpanelsync.exclude”以删除此行。
来源: https://forums.cpanel.net/threads/php-session-timeout-since-64-0-update.598247/
答案 2 :(得分:0)
它没有出现在文档中,但将session.gc_maxlifetime设置为0表示会话在浏览器关闭之前不会过期。
当然,这仍然无法解决与垃圾收集器相关的问题。 最好的解决方案似乎仍在改变session.save_path