【发布时间】:2011-07-25 11:19:27
【问题描述】:
对于我的网站,会话管理大部分都可以正常工作。会话在以后创建、保存和使用都没有问题。
但是当代码使用 session_start() 时,它总是会创建新的、完全空的会话。下面有问题的代码。
header('Content-Type: text/html; charset=UTF-8');
$main_domain = $_SERVER["HTTP_HOST"];
$expld = explode('.', $main_domain);
if(count($expld) > 2) {
$tld = array_pop($expld);
$domain = array_pop($expld);
$main_domain = $domain . "." . $tld;
}
session_set_cookie_params (0, '/', $main_domain);
session_name('sid');
session_start();
echo session_id();
exit;
执行此脚本时,会在每次重新加载时创建新会话。
smar@ran ~> ls /tmp/sess_* | wc -l
10
smar@ran ~> ls /tmp/sess_* | wc -l
11
..
smar@ran ~> ls /tmp/sess_* | wc -l
17
但只有其中一个会话中有任何数据,并被应用程序使用。
浏览器中的输出总是相同的:87412d5882jr85gh5mkasmngg7,它是浏览器 cookie 中的 id 和 /tmp 中填充数据的会话 id。
此行为可能是什么原因?这些空文件并不是什么大问题,但它们确实使 /tmp(或会话目录)无缘无故地填充了很多。
编辑 1:
看起来这是与服务器相关的问题,因为它适用于某些人。我的配置是带有 Apache 和 PHP 5.3.6 的 Gentoo Linux(32 位)。
如果我强制它创建新会话(例如删除我自己的 cookie),它会创建 两个 会话文件而不是一个。如果它重用旧的,它会创建“仅”一个。
编辑 2:
会话配置,根据要求(所有配置行带有session.):
session.save_handler = files
session.save_path = "/tmp"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = On
session.bug_compat_warn = On
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
编辑 3:
更奇怪的是,我尝试使用 CLI 中的会话。在那里,没有设置会话 cookie,它总是创建一个新会话。当使用session_id() 设置固定会话值时,完全停止创建新会话并改用旧会话。
这种行为与 Apache 相同,所以我开始怀疑这是 PHP 中的错误。如果名称专门设置为session_id(),并且会话正确使用,则不会创建新会话。
更荒谬的是,当我从 $_COOKIE["PHPSESSID"] 获取 phpsessid 并将其设置为 session_id() 时,它又开始创建新的(无用的空会话)会话。
编辑 4:
由于我写得不够清楚:简单地拥有
session_start()
由于单个参数会导致此问题发生,因此它并非特定于我的代码。
【问题讨论】:
-
会话时间呢?并尝试评论
session_set_cookie_params (0, '/', $main_domain);可能是其他地方女巫放置名为“sid”的会话 -
如果您将 session_start 放在发送标头之前会发生什么...?
-
@Subdigger:是的,没用。即使是它所在的地方,它也不会在会话之前创建会话,所以我怀疑这是与服务器配置相关的东西。 更新问题
-
我正在使用 Suhosin-Patch (cli) 运行 PHP 5.3.3-7+squeeze1(构建时间:2011 年 3 月 18 日 20:10:12),类似问题
-
允许用户从
/tmp阅读不是安全漏洞吗?它是共享的,并且会话 ID 是可读的...