session_name

(PHP 4, PHP 5, PHP 7, PHP 8)

session_name获取和/或设置当前会话名称

说明

session_name(?string $name = null): string|false

session_name() 返回当前会话的名称。如果指定了 namesession_name() 将更新会话名称并返回会话名称。

如果提供新的会话 namesession_name() 会修改 HTTP cookie(当 session.transid 启用时还会修改输出内容)。一旦 HTTP cookie 发送,session_name() 会引发错误。session_name() 必须在 session_start() 之前调用才能使会话正常工作。

会话名称在请求启动时重置为存储在 session.name 中的默认值。因此,你需要为每个请求(并在调用 session_start() 之前)调用 session_name()

参数

name

会话名称引用会话的名称,它用于 cookie 和 URL(例如 PHPSESSID)。它应该只包含字母数字字符;它应该简短且描述性(即对于启用了 cookie 警告的用户)。如果指定了 name 且不为 null,则当前会话的名称将更改为其值。

警告

会话名称不能仅由数字组成,必须至少包含一个字母。否则每次都会生成新的会话 ID。

返回值

返回当前会话的名称。如果指定了 name 且函数更新了会话名称,则返回会话的名称,或者在失败时返回 false

变更日志

版本 说明
8.0.0 name 现在可以为 null。
7.2.0 session_name() 检查会话状态,之前它只检查 cookie 状态。因此,旧的 session_name() 允许在 session_start() 之后调用 session_name(),这可能会导致 PHP 崩溃并可能导致行为异常。

示例

示例 #1 session_name() 示例

<?php

/* 将会话名称设置为 WebsiteID */

$previous_name = session_name("WebsiteID");

echo
"之前的会话名称是 $previous_name<br />";
?>

参见

添加备注

用户贡献备注 10 个备注

144
洪亮强
20 年前
这可能听起来显而易见:如果在 php.ini 中将 session.auto_start 设置为“true”,则 session_name() 函数将没有实质性影响。显而易见的解释是会话已经启动,因此在执行 session_name() 函数之前(无论它在脚本中的位置)无法更改,这也是 session_name 需要在 session_start() 之前调用的原因,正如文档中所述。

我知道这真的不是什么大问题。但我花了相当长的时间才弄清楚这一点,希望这对像我一样的人有所帮助。
63
php at wiz dot cx
15 年前
如果你尝试将 PHP 会话命名为“example.com”,它会被转换为“example_com”,然后一切都会崩溃。

不要在会话名称中使用句点。
38
relsqui at chiliahedron dot com
15 年前
记住,孩子们——如果你想使用 session_set_cookie_params() 来更改会话超时时间,例如,你必须首先使用 session_name()。否则它将不起作用,不会有任何错误,而且文档中(我所看到的)没有任何解释为什么。

感谢 bildungsroman.com 的 brandan 在 session_set_cookie_params() 下留下了一段备注,解释了这一点,否则我可能会一直对此感到困惑。
21
Joseph Dalrymple
13 年前
对于那些好奇的人来说,这个函数很昂贵!

在一个一直以 0.0025 秒执行的脚本中,仅仅使用 session_name("foo") 就将我的执行时间提高到了大约 0.09 秒。通过简单地牺牲 session_name("foo"),我将脚本速度提高了大约 0.09 秒。
10
Victor H
8 年前
正如 Joseph Dalrymple 所说,添加 session_name 会稍微减慢执行时间。
但是,我观察到它减少了请求之间的波动。
我的脚本上的请求在 0,045 和 0,022 秒之间波动。使用 session_name("myapp") 后,它变为 0,050 和 0,045。这不是什么大问题,但需要注意这一点。

对于那些在设置名称时遇到问题的人,当 session.auto_start 设置为 1 时,你需要在 php.ini 中设置 session.name!
2
mmulej at gmail dot com
3 年前
希望这不会超出 php.net 的范围。

session_name('name') 必须在 session_start() 之前设置,因为前者更改 ini 设置,而后者读取它们。出于同样的原因,session_set_cookie_params($options) 也必须在 session_start() 之前设置。

我发现最好这样做。

function is_session_started()
{
if (php_sapi_name() === 'cli')
return false;

if (version_compare(phpversion(), '5.4.0', '>='))
return session_status() === PHP_SESSION_ACTIVE;

return session_id() !== '';
}
if (!is_session_started()) {
session_name($session_name);
session_set_cookie_params($cookie_options);
session_start();
}
-1
tony at marston-home dot demon dot co dot uk
6 年前
session_name() 获取和/或设置当前会话名称的描述在技术上是错误的。它只处理最初由 php.ini 文件中的 session.name 值提供的 value。

因此:-
$name = session_name();
在功能上等效于
$name = ini_get('session.name');

session_name('newname);
在功能上等效于
ini_set('session.name','newname');

这也意味着
$old_name = session_name('newname');
在功能上等效于
$old_name = ini_set('session.name','newname');

session.name 的当前值在调用 session_start() 之前不会附加到任何会话。一旦 session_start() 使用 session.name 在 cookie 数据中查找 session_id(),名称就变得无关紧要,因为对会话数据的后续所有操作都由 session_id() 作为键。

请注意,在当前会话处于活动状态时更改 session.name 不会更新任何会话 cookie 中的名称。新名称直到下次调用 session_start() 才会生效,这需要关闭当前会话,该会话是使用 session.name 的先前值创建的。
-3
tony at marston-home dot demon dot co dot uk
6 年前
最近对描述进行了修改,添加了“当提供新的会话名称时,session_name() 会修改 HTTP cookie” 的语句。这并不正确,因为 session_name() 从未修改过任何 cookie 数据。会话名称的更改直到调用 session_start() 后才会生效,并且是 session_start() 在不存在 cookie 时创建 cookie。

有关详细信息,请参见以下错误报告:https://bugs.php.net/bug.php?id=76413
-2
descartavel1+php at gmail dot com
1 年前
始终尝试将会话名称属性的前缀设置为 `__Host-` 或 `__Secure-`,以利用浏览器改进的安全功能。请参见 https://mdn.org.cn/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes

此外,如果您启用了 auto_session,则必须在您的配置文件 (php.ini、htaccess 等) 中设置 session.name 中的此名称。
-18
slave at codegrunt dot com
19 年前
我注意到 session_name 的一个问题是,如果 cookie 或 GET/POST 变量值包含非字母数字字符,它将触发 WARNING 级别的错误。如果您的网站显示警告并使用 PHP 会话,这可能是列出至少部分脚本的一种方法。

http://example.com/foo.php?session_name_here=(bad)

Warning: session_start(): The session id contains invalid characters, valid characters are only a-z, A-Z and 0-9 in /some/path/foo.php on line 666

我在文档中没有看到任何提示在打开会话之前必须对 PHP 会话 ID 值进行清理,但事实似乎如此。

不幸的是,session_name() 始终返回 true,因此您必须真正地将变量值分配给它,才能知道您是否被传递了不良的会话数据(就我所知)。换句话说,是在错误生成之后。

干杯
To Top