我正在创建自己的SessionHandler
类,实现SessionHandlerInterface
。
根据the manual,我必须实施5种方法:close()
,destroy($session_id)
,gc($maxlifetime)
,open($save_path, $session_id)
,read($session_id)
和{{1 }}
本手册甚至提供了一个示例实现,而且非常简单。我唯一的问题是PHP会话ID总是以下形式:
hpuhqm4ppmdfaat5s1qmt5s397
但我希望将其更改为更加标准化uuidv5。
由于$ session_id是传递给所有方法的参数,因此我能想到的唯一方法是在write($session_id, $session_data)
方法实现上使用session_id($uuidv5)
覆盖已生成的会话ID,并且这看起来不对。
有更清洁的方法吗?
答案 0 :(得分:2)
有更清洁的方法吗?
更改基础PHP会话ID创建功能。它使用哈希值,默认情况下是可配置的(在session.hash_function
PHP ini directive或session.save_handler
阅读更多内容),但如果现有配置选项与 uuidv5 需求不匹配,则需要添加它是PHP的核心代码或通过PHP扩展。
有关您在评论中呻吟的更多信息,编写PHP扩展程序会“过度”:
userland PHP会话保存处理程序接口不包含核心会话保存处理程序s_create_sid
方法,这实际上是您正在寻找的方法。这使得用户空间变得困难,因为该功能并非打算在用户空间中完成。
由于会话ID创建受安全性的影响,并且PHP核心开发人员过去已经了解到这里很容易出错,因此他们甚至更少信任其他人。那些使用该语言的人,可以在这里轻松更改会话ID生成(我猜测,否则该函数可能已导出到userland会话保存处理程序)。
但是,您可以创建自己的UUID,以便使用会话ID,然后只需哈希以配置的方式作为会话ID。
然后,您可以将UUID表单的非散列值保存为会话变量。
如果你真的需要在前端使用UUID,那么我倾向于说(如果甚至可以在SO回答中说出来)你所做的是多么可疑,我会仔细检查你的动机。因为技术上只需要某些 ID,所以不应该有格式要求,因此我认为没有任何理由不重复使用现有的会话ID。