我试图弄清楚如何在SLIM PHP框架中使会话持续更长时间。 我知道加密的 cookie 和 cookie 会话功能,但我不能使用它,因为我存储在会话中的数据大于 cookie 可以容纳的存储量。
有没有办法让会议持续更长时间?
到目前为止,我已经尝试了以下代码,但没有运气。 会话似乎持续了大约几个小时,然后我必须重新登录。
ini_set('session.cookie_lifetime', 60 * 60 * 24 * 7);
ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 7);
session_cache_limiter(false);
session_start();
PHP 的会话对服务器的配置高度敏感。 有许多可能的地方可能会出错:
服务器配置
服务器可以配置为防止您通过 ini_set
设置这些特定的配置变量。 如果您没有为警告打开错误报告,您甚至可能不知道这些行正在失败。 可以使用phpinfo
查看脚本执行期间使用的实际值。
Debian/Ubuntu
一些操作系统,如Debian和Ubuntu有自己的垃圾收集器,定期清理PHP会话:https://serverfault.com/questions/511609/why-does-debian-clean-php-sessions-with-a-cron-job-instead-of-using-phps-built。
他们不关心你的gc_maxlifetime
设置;他们只是按照固定的时间表运行。
共享主机
请记住,PHP 会话只是作为文件存储在服务器上。 在(配置不佳的)共享服务器中,默认情况下,所有服务器帐户通常将其会话写入同一目录。 换句话说,没有设置任何设置来区分哪些会话属于哪个服务器帐户。
此外,gc_maxlifetime
的值不会以任何方式与单个会话相关联 - 它是每次调用脚本时重新设置的全局值。 再加上 PHP 在调用会话垃圾收集器时调用会话垃圾收集器的事实session_start
,其他帐户的脚本可能会根据调用时使用的任何gc_maxlifetime
值删除您的会话。
解决此问题的唯一方法是将会话放在单独的目录中。 即便如此,您也需要确保在调用您自己的脚本之一时设置gc_maxlifetime
。 一般来说,如果可能的话,这是一个很好的理由,不要使用 PHP 的本机会话。 像Laravel的会话模块这样的软件包可以轻松部署替代会话存储机制,如memcache或数据库。