【问题标题】:PHP Garbage Collector Keeps Removing My SessionsPHP 垃圾收集器不断删除我的会话
【发布时间】:2018-05-25 12:29:44
【问题描述】:

问题:

我有一个使用 PHP 会话允许用户登录的网站。它运行良好。但会话过期太快,1 分钟不活动将注销用户。

我的环境:

PHP 版本:7.1

服务器:NGINX

框架:CakePHP 3.5

到目前为止我做了什么?

我在 StackOverflow 或我得到的任何搜索结果上做了每一个解决方案。我在 php.ini 和 CakePHP 配置中都延长了会话超时时间。

解决方案

经过两三天的研究,我找到了解决办法。在我的 php.ini 中,我找到了一个名为 session.gc_probability 的配置,并为此设置了值 0。现在我的会话永远不会过期,除非用户故意注销。

现在我当前的问题是,我不希望我的session.gc_probability 配置为零,因为它不会收集任何垃圾(对此不太确定。如果此信息请更正我是错的。)。这将导致会话保留数月或数年,这对服务器来说是真正的垃圾。

我想到了从heresession.gc_probability 零值

session.gc_divisor coupled with session.gc_probability defines the 
probability that the gc (garbage collection) process is started on 
every session initialization. The probability is calculated by using 
gc_probability/gc_divisor, e.g. 1/100 means there is a 1% chance that 
the GC process starts on each request. session.gc_divisor defaults to 
100.

我的配置到底有什么问题?是什么导致垃圾收集很快删除我的会话? session.gc_probability 是 1,session.gc_divisor 是 1000。我认为 1/1000 概率的进程不应该每 1 或 2 分钟启动一次。

【问题讨论】:

  • 你的Session.handler是什么?
  • gc_maxlifetime 设置为什么?垃圾收集可能不是问题,只是副作用。
  • @ÁlvaroGonzález 它是默认的 php 会话处理程序。那不应该是“文件”吗?
  • @Devon 我会在一分钟内回复你
  • 好吧,垃圾收集不应该在任何会话上开始,直到它已经过时 1440(或 gc_maxlifetime)秒。因此,活动会话中的 1-2 分钟表明我的系统存在其他问题。

标签: php session cakephp cakephp-3.5


【解决方案1】:

根据您的后续行动,您对Session.handler 的设置是phpSessions 文档说明:

内置配置有:

  • php - 使用 php.ini 文件中的标准设置保存会话。
  • cake - 将会话保存为 tmp/sessions 中的文件。在不允许您在您的外部写作的主机上,这是一个不错的选择 自己的主目录。

[…]

session.save_path 的默认 php.ini 设置取决于您的 PHP 发行版(无论如何都可以更改),但它通常涉及所有未选择退出的 PHP 应用程序的共享数据存储。这意味着session.gc_maxlifetime 最短的应用很可能会从其他应用中删除会话数据。

切换到cake 应该可以解决这个问题。


关于session.gc_probabilitysession.gc_divisor 的一些后续工作。过于激进地设置它们会导致频繁的垃圾收集。这可能会损害性能,但不会导致数据过早过期。另一方面,太松散的值仍将允许访问过时的数据。

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 1970-01-01
    • 2012-06-28
    • 2020-03-06
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多