php - PHP Session:不启动检查
问题描述
是否可以在不启动新会话 ID 的情况下检查某个会话 ID 是否存在?
我问这个的原因是:
如果每个未登录的用户都需要访问该站点
session_start()
,那么会话文件夹很快就会被不必要的文件膨胀(即使垃圾收集器清理过期的会话)。
当然,这可以通过破坏此类用户的会话来缓解。但是,在这种情况下,创建和销毁文件似乎会产生开销(除非 PHP 足够聪明,可以取消这些操作)。这是一个不好的做法吗?如果用户只是访客并且不需要会话,则无需为他创建会话。
理想的解决方案:
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,没有一个答案正确解决了这个问题。
解决方案
我认为您正在尝试在这里解决错误的问题。要回答您的问题,不,您必须在执行会话操作之前使用 session_start。如果在与session_destroy相同的请求中不需要会话,您也可以销毁会话。
您可以使用一些巧妙的会话存储选项来解决 session_start 问题,但我认为这只是您遇到的问题的错误答案。当您的服务器安装占用空间至少为 8GB 时,存储在 FS 上的会话大小实际上可以忽略不计。此外,默认会话存储位置是 /tmp,它通常设置为 ramfs 以避免任何磁盘开销。如果您遇到 FS 会话存储的限制,您可能需要使用不同的SessionHandler,例如memcached,不用担心是否需要开始会话。在相关说明中,请停止过早地优化您的代码。除非您需要多台服务器,否则会话存储不会成为问题。实际上,将有更多的数据库查询可以从额外的索引中受益,而不是像这样的模糊优化。
推荐阅读
- python - 获取具有相同字符串值的一组行的平均值
- android - 用于嵌套导航的 Flutter WillPopScope
- ruby - 如何解决自定义 RubyGem 的依赖关系?
- macos - 尝试在 Mac OS Catalina 上为 OpenCV for Python 3.6.5 安装 virtualenv 时出错
- azure - 密码重置流程 Azure AD B2C
- reactjs - 如何使用 Promise 创建受保护的路由
- python - 内核不断死亡 Jupyter,Anaconda。尝试使用神经核函数实现共指解析
- c# - web api 项目的默认路由
- plotly-dash - 在破折号的下拉菜单中更改文本输入的字体颜色
- bluetooth - 蓝牙查找设备