问题描述
突然之间,我的自定义会话处理程序的 session_start() 不起作用。升级到 PHP 8 后我必须包含 destroy 。这在 PHP 7.4 中不是问题。
private static function load()
{
# session_module_name("user");
session_set_save_handler(['\CB\Session','open'],['\CB\Session','close'],'read'],'write'],'remove'],'gc'],'destroy']
);
session_start(); // Error here
}
public static function destroy($id)
{
return TRUE;
}
致命错误:未捕获的 ArgumentCountError:参数太少 函数 CB\Session::destroy(),0 已通过,预期为 1 会话.PHP: 堆栈跟踪: #0 [内部函数]:CB\Session::destroy() #1 /path/CB/Session.PHP(35): session_start() #2 /path/CB/Session.PHP(17): CB\Session::load()
为什么要为 session_start(登录)谈论 session_destroy?我的登出工作正常。
编辑:由于某种原因,CB\Session::destroy() 在 session_start() 之前被调用
解决方法
根据the session_set_save_handler manual page,参数是:
- $open
- $关闭
- $阅读
- $write
- $destroy
- $gc
- (可选)$create_sid
- (可选)$validate_sid
- (可选)$update_timestamp
您提供的方法名称是:
- '打开'
- '关闭'
- '阅读'
- '写'
- '删除'
- 'gc'
- '破坏'
因此,会话“destroy”事件调用的方法是\CB\Session::remove
,而“create_sid”事件调用的方法是\CB\Session::destroy
。由于在没有任何参数的情况下调用 create_sid 回调,这会给您带来您所看到的错误。
在您的问题开始时,您说:
升级到 PHP 8 后我必须包含 destroy 。
由于您实际包含的是一个损坏的 create_sid 回调,因此您认为要解决的任何问题可能仍然需要解决,但这将是一个不同的问题。当前错误的解决方案是从代码中删除错误的 ['\CB\Session','destroy']
行。