首页 > 解决方案 > PHP Session:不启动检查

问题描述

是否可以在不启动新会话 ID 的情况下检查某个会话 ID 是否存在?

我问这个的原因是:

  1. 如果每个未登录的用户都需要访问该站点session_start(),那么会话文件夹很快就会被不必要的文件膨胀(即使垃圾收集器清理过期的会话)。
    当然,这可以通过破坏此类用户的会话来缓解。但是,在这种情况下,创建和销毁文件似乎会产生开销(除非 PHP 足够聪明,可以取消这些操作)。这是一个不好的做法吗?

  2. 如果用户只是访客并且不需要会话,则无需为他创建会话。

 

理想的解决方案:

if( session_exist($_COOKIE['PHPSESSID']) )
{
    session_start();
}

或者:

session_start(RESUME_ONLY);

 


跟进

有一个 PHP 包可以更好地解释上述问题。简而言之,一些有趣的摘录是:

恢复会话
[...]
您可以自己启动一个新会话以重新填充$_SESSION,但如果您实际上不需要会话数据,则会产生性能开销。类似地,当之前没有会话时可能不需要启动会话(因此没有数据可以重新填充到 中$_SESSION)。我们需要的是一种在之前启动会话的情况下启动会话的方法,但如果之前没有启动会话,则避免启动会话。
[...]
如果 cookie 不存在,它将不会启动会话,并返回调用代码。这样可以避免在没有$_SESSION要填充的数据时启动会话。
 
资料来源:Aura.Auth

 

笔记:

这个问题最初发布为Checking for PHP session without start one? .
但是,IMO,没有一个答案正确解决了这个问题。

标签: phpsessioncookies

解决方案


我认为您正在尝试在这里解决错误的问题。要回答您的问题,不,您必须在执行会话操作之前使用 session_start。如果在与session_destroy相同的请求中不需要会话,您也可以销毁会话。

您可以使用一些巧妙的会话存储选项来解决 session_start 问题,但我认为这只是您遇到的问题的错误答案。当您的服务器安装占用空间至少为 8GB 时,存储在 FS 上的会话大小实际上可以忽略不计。此外,默认会话存储位置是 /tmp,它通常设置为 ramfs 以避免任何磁盘开销。如果您遇到 FS 会话存储的限制,您可能需要使用不同的SessionHandler,例如memcached,不用担心是否需要开始会话。在相关说明中,请停止过早地优化您的代码。除非您需要多台服务器,否则会话存储不会成为问题。实际上,将有更多的数据库查询可以从额外的索引中受益,而不是像这样的模糊优化。


推荐阅读