是否可以检查没有开始的会话?
我问的原因是,我正在开发的应用程序有一个集成的管理界面。因此,当管理员登录时,他们浏览与用户相同的页面以进行编辑。字段和选项基于用户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"
这些都没有帮助我。除非我遗漏了什么。
答案 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()]));
}