检查PHP会话而不启动它?

时间:2009-11-23 01:47:19

标签: php caching session smarty

是否可以检查没有开始的会话?

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

这导致了两个问题。

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

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

我使用smarty输出模板,但无法实现:

$smarty->cache_modified_check = true;

发送304未修改,因为会话已经启动。使用上面的smarty param对我来说是浏览器缓存的完美解决方案。

两个是因为每个使用该网站的人都在启动一个会话,会话目录会被不需要的会话填满。

如果用户没有登录,我可以破坏会话,但是每次加载一个页面,用户就会创建和删除会话。这是不好的做法吗?

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

理想情况下的东西:

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

---------------回应Tony Miller ---------------

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

session_start();
echo session_id($_SESSION);

或者您可以在调用会话开始之前为会话设置ID

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

//prints "adfasdf"

这些都没有帮助我。除非我遗漏了什么。

3 个答案:

答案 0 :(得分:12)

你想要session_id(),如果没有定义会话则返回空字符串。

文档表明如果没有启动会话,则返回空字符串(不是“无”)。

正如2014年的评论所指出的那样(我在2009年写了这个答案),如果有一个存储有会话ID的cookie可以由session_start()获取,则会话可能会开始。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

这是一个可以执行您所要求的功能,即在启动会话之前检查会话是否存在:

function sessionExists() {
    return (isset($_COOKIE[session_name()]));
}

如果要在创建它的同一请求中测试它,可以改为:

function sessionExists() {
    return (isset($_SESSION) || isset($_COOKIE[session_name()]));
}