我想实现一个 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()
将再次调用不必要的会话。
所以问题是,根据我的观察,实际上是两个问题
有没有办法在调用之前指定 PHP 应该如何创建会话 ID(似乎不可能)
session_start()
?有没有办法检查是否
session_start()
必须创建一个新会话,或者只使用一个可用的服务器端?(这将消除它的第一个电话)
欢迎任何好的选择。
编辑
澄清什么是自定义 ID。
会话 ID 是 PHP 用来在服务器上检索会话的字符串键,每个用户都有不同的键。该密钥通常存储在 cookie 中,然后浏览器将该 cookie 及其请求发送到服务器/PHP 以“连接”到会话。PHP 根据设置自动设置会话 ID 密钥,基于 MD5(用户和时间相关数据)或 SHA1(相同相关数据)。因此,会话 ID 是 MD5 或 SHA1 密钥 - 希望是唯一的。
自定义 ID 是程序员(我)手动创建的密钥,绕过了 md5/sha1 创建。