检查PHP会话而不启动它?

use*_*119 16 php session caching smarty

是否可以检查没有启动会话的会话?

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

这导致了两个问题.

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

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0       
Run Code Online (Sandbox Code Playgroud)

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

$smarty->cache_modified_check = true;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

理想的东西是这样的:

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

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

使用session_id()时,您必须已经启动会话以返回id.

session_start();
echo session_id($_SESSION);
Run Code Online (Sandbox Code Playgroud)

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

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

//prints "adfasdf"
Run Code Online (Sandbox Code Playgroud)

这些都不能帮助我.除非我遗漏了什么.

Ton*_*ler 11

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

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

正如2014年的评论所指出的那样(我在2009年写了这个答案),如果有一个会话ID存储在其中的cookie可以被session_start()接收,那么会话就有可能开始.

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

  • 在session_start()之前调用session_id()不会返回任何内容,即使POTENTIAL会话可用(即使PHPSESSID设置为某个东西). (5认同)
  • 为什么这个答案有 12 票赞成?从问题的意义上来说,它不起作用...抱歉,但是我的-1。写更多,描述更多,并告诉我们为什么这应该有效,我将取消我的反对票。 (2认同)

Ark*_*rkh 5

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

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