首页 > 解决方案 > session_start() 在 PHP 8 中为 session_destroy() 提供错误

问题描述

突然之间,我的自定义会话处理程序的 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'],
                             ['\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;
}

致命错误:未捕获的 ArgumentCountError:函数 CB\Session::destroy() 的参数太少,传递了 0,而 Session.php 中预期正好为 1:堆栈跟踪:#0 [内部函数]:CB\Session::destroy()# 1 /path/CB/Session.php(35): session_start() #2 /path/CB/Session.php(17): CB\Session::load()

为什么要谈论 session_start (login) 的 session_destroy ?我的注销工作正常。

编辑:出于某种原因 CB\Session::destroy() 在 session_start() 之前被调用

标签: phpsessionphp-8

解决方案


根据session_set_save_handler 手册页,参数是:

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

您提供的方法名称是:

  1. '打开'
  2. '关'
  3. '读'
  4. '写'
  5. '消除'
  6. 'GC'
  7. '破坏'

因此,会话“destroy”事件调用的方法是\CB\Session::remove,并且该\CB\Session::destroy方法被“create_sid”事件调用。由于 create_sid 回调是在没有任何参数的情况下调用的,因此这会给您带来您所看到的错误。

在您的问题开始时,您说:

升级到 PHP 8 后,我必须包括销毁。

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


推荐阅读