PHP在每次重新加载时创建新会话

Sma*_*mar 7 php session

对于我的网站,会话管理大多正常.会话可以在以后创建,保存和使用而不会出现问题.

但是当代码使用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;
Run Code Online (Sandbox Code Playgroud)

执行此脚本时,在每次重新加载时都会创建新会话.

smar@ran ~> ls /tmp/sess_* | wc -l
10
smar@ran ~> ls /tmp/sess_* | wc -l
11
..
smar@ran ~> ls /tmp/sess_* | wc -l
17
Run Code Online (Sandbox Code Playgroud)

但只有其中一个会话中包含任何数据,并由应用程序使用.

浏览器中的输出始终相同: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
Run Code Online (Sandbox Code Playgroud)

编辑3:

更奇怪的是,我尝试使用CLI中的会话.在那里,没有设置会话cookie,它总是创建一个新会话.当设置固定会话值时,session_id()完全停止新会话创建并使用旧会话.

这种行为与Apache相同,所以我开始怀疑这是PHP中的错误.如果名称专门设置session_id(),并且会话正确使用,则不会创建新会话.

更荒谬的是,当我从中获取phpsessid $_COOKIE["PHPSESSID"]并将其设置为session_id()时,它又开始创建新的(无用的空的)会话.

编辑4:

因为我写得不够清楚:只是拥有

session_start()
Run Code Online (Sandbox Code Playgroud)

因为单个参数会导致此问题发生,所以它并不特定于我的代码.

sym*_*ean 3

Cookie 仅返回到设置它们的虚拟主机/路径。

由于您的路径是“/”,这意味着页面不是通过 $domain 请求的。“。” 。$顶级域名;

例如,用户通过 www.example.com 请求页面

cookie 是为 example.com 设置的

用户从 www.example.com 访问后续页面 - cookie 不在范围内。

来自RFC 2965

xycom 域匹配 .Y.com,但不匹配 Y.com。

实际上,如果您继续阅读,规范确实规定,如果未提供任何内容,则用户代理应在主机前添加一个点,但是您进入了浏览器行为各不相同的领域。

如果您只是返回带有与请求匹配的虚拟主机的 cookie,它将按预期工作。