在不启动PHP会话的情况下检查PHP会话?

2022-08-30 21:14:36

是否可以在不启动会话的情况下检查会话?

我问的原因是,我正在开发的应用程序具有集成的管理界面。因此,当管理员登录时,他们浏览与用户相同的页面以进行编辑。字段和选项根据用户权限显示。

这会导致两个问题。

种是因为正在启动会话,我无法启用浏览器缓存功能,因为发送的标头始终是:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0       

我正在使用smarty来输出模板,并且无法实现:

$smarty->cache_modified_check = true;

发送未修改的 304,因为会话已启动。使用上述智能参数对我来说将是浏览器缓存的完美解决方案。

是因为使用该站点的每个人都在启动会话,因此会话目录会充满不需要的会话。

如果用户未登录,我可以销毁会话,但随后每个页面加载,用户将创建和删除会话。这是不好的做法吗?

因此,如果我可以在不启动会话的情况下检查是否存在活动会话,那么我的所有问题都将得到解决。有什么想法吗?浏览器在请求页面时不会发送会话 Cookie 吗?

理想情况下,如下所示:

if (session_exists) {
 session_start();
 $users->priv = $_SESSION['priv'];
}
else {
 $users->priv = guest;
}

--------------- 回应托尼·米勒---------------

使用 session_id() 时,您必须已经启动了会话才能返回 id。

session_start();
echo session_id($_SESSION);

或者,您可以在呼叫会话开始之前为会话设置 ID

session_id("adfasdf");
session_start();
echo session_id($_SESSION);

//prints "adfasdf"

这些都不能帮助我。除非我错过了什么。


答案 1

您需要session_id(),如果未定义会话,则返回空字符串。

文档指示如果未启动会话,则返回空字符串(不是“nothing”)。

正如2014年的评论所表明的那样(我在2009年写了这个答案),如果存在一个cookie,其中存储了一个会话ID,session_start()可能会启动会话。

从 PHP 5.4.0 开始,我们现在有 session_status(),但这在 2009 年并不存在。


答案 2

您可以检查是否设置了 PHPSESSID Cookie(PHPSESSID 名称可能有另一个名称,具体取决于您的服务器设置,请检查 ini.session.name)。

但是,如果您担心的只是破坏您的会话目录,则可以调整session.gc_probability,session.gc_divisor和session.gc_maxlifetime,以使它们更快地消失。


推荐