PHP会话澄清

时间:2016-10-30 10:13:28

标签: php session

好好经过几天的挫折之后,我偶然发现了会话问题,不幸的是我不确定我发现的解决方案是否会成为安全问题或风险。

我正在我的localhost上的一个php项目登录应用程序,我可以走了5,10甚至15分钟然后回来,我仍然可以通过我的应用程序登录。当我上传我的项目进行测试线上。如果我登录,我可以在2-3分钟内刷新,并且必须重新登录。

我在这里尝试了大约50个帖子的所有内容并且没有结果。所以我决定在我的localhost和我的主机上阅读每一行phpinfo进行比较。什么也没想出来......好吧,事实上我看了一眼细节......

所以今天早上喝咖啡留下一点点头发......我发现了问题。

  

session.cache_expire 180

现在无论会话生命周期如何,这都会在3分钟后关闭。 也在localhost上,

  

session.gc_divisor 1000

session.gc_divisor在localhost上是1000,但在我的网站主机上是100,

现在我有一个名为sessions.php的文件,它是我的session_start。我找到的解决方案就在这里。 http://php.net/manual/en/function.session-cache-expire.php

所以我已将会话文件更改为以下内容。

session_cache_limiter('private');
$cache_limiter = session_cache_limiter();

session_cache_expire(30);
$cache_expire = session_cache_expire();
session_start();
ob_start();

结果是当我将浏览器打开超过3分钟时,它不再需要我重新登录..但这是一个合适的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您应该知道session.cache_expire与PHP会话的生命周期无关。它与HTTP缓存有关。您的Web服务器前面是否有代理缓存内容?这就是该设置所控制的内容。

就PHP会话生命周期而言,这里是您的关键设置:

session.gc_maxlifetime - 会话被标记为"垃圾"之前的秒数。这由服务器

强制执行

session.cookie_lifetime - 会话Cookie到期前的秒数。这是由客户端(网络浏览器)

强制执行的

你必须确保两者互相称赞。如果服务器端在客户端之前到期,则客户端将显示会话cookie,服务器将拒绝它。如果客户端cookie在服务器端之前到期,则浏览器根本不会发送会话cookie,服务器将发送一个新的认为它是新客户端。

至于垃圾收集本身,它不会影响会话生命周期,因为这只会被标记为"垃圾"由服务器。有两个关键设置:

<强> session.gc_probability合

<强> session.gc_divisor

考虑这些问题的最简单方法是作为一个分数。例如:

session.gc_probability = 1

session.gc_divisor = 100

客户端请求将触发垃圾收集器的概率为百分之一。因此,100个客户端中有1个会出现性能下降(实际上并非如此 - 它非常快)。它可能在您的生产服务器上设置为1000,因为它处理了大量流量。也就是说,如果您在一分钟内收到1000个请求,您可能只希望每分钟调用一次garbarge收集器。