微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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'],'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,参数是:

  1. $open
  2. $关闭
  3. $阅读
  4. $write
  5. $destroy
  6. $gc
  7. (可选)$create_sid
  8. (可选)$validate_sid
  9. (可选)$update_timestamp

您提供的方法名称是:

  1. '打开'
  2. '关闭'
  3. '阅读'
  4. '写'
  5. '删除'
  6. 'gc'
  7. '破坏'

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

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

升级到 PHP 8 后我必须包含 destroy 。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。