session_start() 在 PHP 8 中给出 session_destroy() 的错误

session_start() giving error for session_destroy() in PHP 8

突然之间,我的自定义会话处理程序的会话 session_start() 无法正常工作。升级到 PHP 8 后,我必须包含销毁。这在 PHP 7.4 中不是问题。

private static function load()
{
    # session_module_name("user");
    session_set_save_handler(['\CB\Session', 'open'],
                             ['\CB\Session', 'close'],
                             ['\CB\Session', 'read'],
                             ['\CB\Session', 'write'],
                             ['\CB\Session', 'remove'],
                             ['\CB\Session', 'gc'],
                             ['\CB\Session', 'destroy']
                             );        
    
    session_start(); // Error here
}

public static function destroy($id)
{
    return TRUE;
}

Fatal error: Uncaught ArgumentCountError: Too few arguments to function CB\Session::destroy(), 0 passed and exactly 1 expected in Session.php: Stack trace: #0 [internal function]: CB\Session::destroy() #1 /path/CB/Session.php(35): session_start() #2 /path/CB/Session.php(17): CB\Session::load()

为什么说 session_destroy 用于 session_start(登录)?我的注销正常。

编辑:由于某种原因 CB\Session::destroy() 在 session_start()

之前被调用

根据the session_set_save_handler manual page,论点是:

  1. $打开
  2. $关闭
  3. $阅读
  4. $写
  5. $销毁
  6. $gc
  7. (可选)$create_sid
  8. (可选)$validate_sid
  9. (可选)$update_timestamp

您提供的方法名称是:

  1. 'open'
  2. 'close'
  3. 'read'
  4. 'write'
  5. 'remove'
  6. 'gc'
  7. 'destroy'

所以会话“destroy”事件调用的方法是\CB\Session::remove\CB\Session::destroy方法是为“create_sid”事件调用的。由于 create_sid 回调是在没有任何参数的情况下调用的,因此会出现您所看到的错误。

在你的问题开头你说:

I had to include destroy after upgrading to PHP 8.

由于您实际包含的是一个损坏的 create_sid 回调,无论您认为您正在解决的问题可能仍然需要解决,但那将是一个不同的问题。当前错误的解决方案是从代码中删除错误的 ['\CB\Session', 'destroy'] 行。