【发布时间】:2012-10-16 08:22:31
【问题描述】:
我想实现一个 PHP 自定义会话 ID,同时避免不必要地调用 session_start()。
基本上,一种简单的算法是
session_start();
if ( ! isset( $_SESSION['MyStuff'] )) {
session_write_close();
session_id( generate_my_id() );
session_start();
}
$_SESSION['MyStuff'] = some stuff...;
如果会话一开始就过期或不存在,第一个session_start() 将创建自己的 ID 并向浏览器发送 cookie。然后会话结束,并创建另一个会话,发送另一个 cookie(加上创建和关闭会话文件的开销)。
另一种解决方案是测试 PHPSESSID cookie 是否存在,其值是否具有根据 - homecooked - generate_my_id() 函数的格式 - 然后再次测试 $_SESSION 值是否存在。但是,如果会话过期(没有 $_SESSION['MyStuff']),将再次调用不必要的 session_start()。
所以问题是,根据我的观察,实际上是两个问题
有没有办法在调用
session_start()之前指定PHP应该如何创建会话ID(似乎不可能)?有没有办法检查
session_start()是否必须创建一个新会话,或者只使用一个可用的服务器端? (这将消除它的第一次调用)
欢迎任何好的选择。
编辑
关于什么是自定义 ID 的说明。
会话 ID 是 PHP 用来在服务器上检索会话的字符串键,每个用户都有不同的键。该密钥通常存储在 cookie 中,然后浏览器将该 cookie 及其请求发送到服务器/PHP 以“连接”到会话。 PHP 根据设置自动设置会话 ID 密钥,基于 MD5(用户和时间相关数据)或 SHA1(相同相关数据)。因此,会话 ID 是 MD5 或 SHA1 密钥 - 希望是唯一的。
自定义 ID 是程序员(我)手动创建的密钥,绕过 md5/sha1 创建。
【问题讨论】:
-
@W 谢谢,但我不知道它在哪里
-
嗨@ring0 这个怎么样? gist.github.com/3898302
-
@W 这基本上是下面的答案之一,它不起作用,因为 a) 没有自定义 id,b)
session_id()结果在调用session_start()之前是没有意义的