会话\写入\关闭():无法使用用户定义的保存处理程序写入会话数据。PHP 7.3.1

会话\写入\关闭():无法使用用户定义的保存处理程序写入会话数据。PHP 7.3.1,php,session,Php,Session,我已经编写了一个自定义会话处理程序类,在我尝试注销用户并销毁会话之前,该类在大多数情况下都能正常工作,然后我不断收到以下错误: 错误异常:0 会话\写入\关闭:无法使用用户定义的保存处理程序写入会话数据。session.save_路径:D:\xampp\tmp 我正在XAMPP上运行PHP 7.3.1版 这是我的定制课程 类CornerstoneSessionHandler实现SessionHandlerInterface{ /** *构建会话 *不需要参数,将不返回任何内容 */ 公共函数构造

我已经编写了一个自定义会话处理程序类,在我尝试注销用户并销毁会话之前,该类在大多数情况下都能正常工作,然后我不断收到以下错误:

错误异常:0 会话\写入\关闭:无法使用用户定义的保存处理程序写入会话数据。session.save_路径:D:\xampp\tmp 我正在XAMPP上运行PHP 7.3.1版

这是我的定制课程

类CornerstoneSessionHandler实现SessionHandlerInterface{ /** *构建会话 *不需要参数,将不返回任何内容 */ 公共函数构造{ //将处理程序设置为覆盖会话 会话\u设置\u保存\u处理程序 数组$this,打开, 数组$此,关闭, 数组$this,读取, 数组$this,write, 数组$这个,销毁, 数组$this,gc ; //设置关机功能 寄存器_shutdown_函数'session_write_close'; /**定义并初始化会话处理程序*/ 会议开始; } /** *设置打开回调 * *@param string$savePath *@param string$sessionName * *@return bool返回值应为true表示成功,false表示失败 */ 公共函数open$savePath$sessionName{ //使$csdb全局可访问 全球$csdb; //检查数据库连接是否已设置 return!空$csdb&&$csdb->isConnected!=1?FALSE:TRUE; } /** *设置关闭回调 * *@return bool返回值只能为true表示成功 */ 公共功能关闭{ 返回TRUE; } /** *设置读取回调 * *@param string$sessionID * *@return string返回值应为会话数据或空字符串 */ 公共函数读取$sessionID{ //使$csdb全局可访问 全球$csdb; //从数据库中获取会话 $csdb->query_preparedSELECT session_data FROM cs_session,其中session_id=?,[$sessionID]; //如果返回结果,请继续 如果$csdb->getNum_行>0{ //获取数据 $result=$csdb->get_rowNULL; 返回$result->session\u数据; }else{//else返回一个空字符串 回来 } } /** *设置写回调 * *@param string$sessionID *@param string$data * *@return bool返回值应为true表示成功,false表示失败 */ 公共函数write$sessionID$data{ //使$csdb全局可访问 全球$csdb; //设置时间戳 $access\u dtm=new\DateTime; //替换数据 $csdb->query_prepared'REPLACE to cs_sessionsession_id,session_ip_地址,session_数据,session_access_dtm值?,?,,?,?,?,[$sessionID,$_SERVER['REMOTE_ADDR'],$data,$access_dtm->format'Y-m-d H:i:s'; //如果修改成功,则返回true 如果$csdb->getNum_行>0{ 返回TRUE; }else{//else,返回false 返回FALSE; } } /** *设置销毁回调 * *@param string$sessionID * *@return bool返回值应为true表示成功,false表示失败 */ 公共函数$sessionID{ //使$csdb全局可访问 全球$csdb; //从数据库中删除会话 $csdb->删除'cs_session',其中eq'session_id',$sessionID; //如果返回结果,则返回true 如果$csdb->affectedRows>0{ 返回TRUE; }else{//else,返回false 返回FALSE; } } /** *设置垃圾回收器回调 * *@param string$life * *@return bool返回值应为true表示成功,false表示失败 */ 公共函数gc$生存期{ //使$csdb全局可访问 全球$csdb; //设置日期计算 $expiredTime=new\DateTime; $expiredTime->修改“-”.$lifetime.“秒”; //从数据库中获取会话 $csdb->删除'cs_session',其中lt'session_access_dtm',$expiredTime->格式'Y-m-d H:i:s'; //如果结果已删除,则返回true 如果$csdb->affectedRows>0{ 返回TRUE; }else{//else,返回false 返回FALSE; } } } 我正在使用作为我的数据库处理程序

这是我所有页面顶部的代码

/** *设置会话数据,以便在所有浏览器上正常登录 *这将修复一些用户可能面临的登录错误 *更多信息可以在{@link上找到https://www.php.net/manual/en/session.security.ini.php php用户手册} */ 防止会话劫持 防止旨在窃取会话ID的javascript XSS攻击 ini_set'session.cookie_httponly',1; 确保cookie生存期设置为“0” ini_设置'session.cookie_life',0; 将熵作为PHP的随机数添加到会话ID的随机化中 发电机有一些已知的缺陷 ini_设置'session.entropy_文件','/dev/uradom '; 使用强散列 ini_集'session.hash_函数','whirlpool'; 为共享服务器设置最佳会话保存位置 如果要设置自定义路径,并且尚未在`php.ini`文件中设置值,请取消注释下一行。 ini_设置'session.save_path',realpathABSPATH'tmp’。目录分隔符; 注意:上面引用的文件夹必须存在才能正常工作。 将会话垃圾收集生存期设置为自定义的分钟数PHP默认值为24分钟 ini_设置'session.gc_maxlifest',intget_选项session_expire*分钟(秒); 启用会话垃圾回收,有1%的几率 在每个会话上运行\u启动 ini_集合'session.gc_probability',1; ini_set'session.gc_除数',100; 如果可能,使用安全连接HTTPS 如果不是HTTPS站点,则允许通过不安全的连接发送cookie 网站地址?ini_set'session.cookie_secure',1:ini_set'session.cookie_secure',false; 防止会话固定 无法通过URL传递会话ID 因此,仅使用cookies在客户端存储会话id ini设置“会话。仅使用cookies”,1; 设置自定义会话名称 会话名称“cssessiond”; 加载会话类 新的CornerstoneSessionHandler; 如果会话尚未启动,请启动该会话 如果session_status==PHP_session_NONE{session_start;} 奇怪的是,即使它给了我这个错误,如果我检查数据库,数据就会被更新,不用担心

这是我的注销代码

/** *注销用户 * *@returnbool */ 公共静态函数logoutUser{ //让$fear全球可访问 全局$fear;//直接访问检查 //检查会话是否设置为以防万一,如果未设置则启动 ifsession\u id=={session\u start;} //删除`authenticateUser'中的$\u会话数据集` 取消设置$_会话['HTTP_用户_代理]; 取消设置$会话[''cs-uid']; 未设置$会话[''cs-ue']; 未设置$会话[''cs-ul']; 未设置$会话[''cs-un']; /** *获取ext.auth.php文件并运行'clearCustomAuth'函数 *要清除任何自定义设置$\u会话项 */ 需要一次获取库路径'ext.auth.php'; clearCustomAuth; //重新生成新会话ID以确保 会话\重新生成\ id; //销毁会话 会话(u)销毁;; //检查是否设置了$\u COOKIE数据 ifisset$_COOKIE[''u cs-ti']和&!empty$_COOKIE['u cs-ti']{ //从数据库中删除cookie令牌 if!self::deleteAuthCookie$\u COOKIE[''u cs-ti']{ //如果无法删除cookie,则返回false 返回false; } } //如果一直运行,则返回true 返回true; } 我尝试过转换会话\u REGREATE\u id,但如果我将其放在会话\u销毁之后,它会说没有会话要重新生成,但如果我将其放在会话\u销毁之前或根本没有会话,我的会话将从数据库中删除,但我仍然可以在Firefox上的检查器中的存储中看到它

它只在尝试从数据库中删除会话时给我一个错误。其他一切都可以,不用担心!我在测试中手动尝试从数据库中删除一个会话,但仍然出现该错误


有没有人能看到我可能做错了什么,或者我可以如何修复它?我才刚刚了解到这一点,对它来说太陌生了。如果我需要提供更多信息,请告诉我。我已经在网上搜索了将近两天,但运气不佳。

我看不出你需要设置关机处理程序的原因。php关闭时会自动保存会话,即使您遇到致命错误


此外,write、destroy和gc应该始终返回true,即使没有更新/删除任何行。这似乎与直觉相反,但php认为删除不存在的会话也是成功的。

啊,谢谢。看来已经修好了!我从网上看到的示例中复制了我的代码,并进行了常规检查。不过还是有道理的。谢谢。@dpDesignz,对于后代来说,实际的代码更改是什么?我不确定我是否了解这里发生的变化。