【问题标题】:session_start() giving error for session_destroy() in PHP 8session_start() 在 PHP 8 中为 session_destroy() 提供错误
【发布时间】:2021-08-01 01:08:30
【问题描述】:

突然之间,我的自定义会话处理程序的 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 并且期望在 会话.php: 堆栈跟踪: #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() 之前被调用

【问题讨论】:

  • destroy 在哪里被调用?它指的是哪一行?
  • 在我的 act_logout 函数中。 $_SESSION = array(); if (isset($_COOKIE[session_name()])) setcookie(session_name(), '', time()-42000, '/'); @session_destroy(); # Throws an error in PHP7, so hence the @
  • 你在哪里打电话Session::destroy()?您问题中的类是如何集成到 PHP 的会话处理中的?
  • 我正在调用 session_destroy();仅在有人单击注销链接时调用的 act_logout() 中。无处。这就是我要为 PHP 8 修改的内容 - github.com/anjanesh/CB/blob/master/Session.php

标签: php session php-8


【解决方案1】:

根据the session_set_save_handler manual page,参数是:

  1. $open
  2. $关闭
  3. $读
  4. $写
  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'] 行。

【讨论】:

  • 谢谢 IMSoP - 我将 remove 替换为 destroy 并返回 TRUE - 它有效。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 2011-08-25
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多