首页 > php教程 > php手册 > 正文

discuz清空session,导致session保存机制失败,session无法更新与解决

php中文网
发布: 2016-06-13 10:57:43
原创
1511人浏览过

[php
 
 
 
 
function userErrorHandler() { 
    $e = func_get_args(); 
    echo '

<br/>----------运行出错---------:<br/>'.print_r($e, 1).'<br/>----------运行出错---------<br/>
登录后复制
'; 

set_error_handler("userErrorHandler"); 
set_exception_handler("userErrorHandler"); 
 
function shutdown() { 
    $a=error_get_last();     
    if($a != null) echo '
<br/>++++++低级错误+++++<br/>'.print_r($a, 1).'<br/>++++++低级错误+++++<br/>
登录后复制
';    
}  
 
register_shutdown_function('shutdown');//如果使用了exit将不运行此脚本  
 
 
switch($_GET['how']) { 
    case 's'://set  
        session_start(); 
        $_SESSION['qidizi'] = rand(); 
        echo $_SESSION['qidizi']; 
        break; 
    case 'u'://unset  
        session_start(); 
        $_SESSION['qidizi'] = 'qidiziUNSET'; 
        echo $_SESSION['qidizi']; 
        break; 
    case 'g'://get  
        session_start(); 
        var_dump($_SESSION); 
        break; 
    case 'c'://clean  
        session_start(); 
        echo 'get---------
'; 
        var_dump($_SESSION); 
        echo '
edit-------/>'; 
        $_SESSION['qidizi'] = 'qidiziCLEAN'; 
        var_dump($_SESSION); 
        echo '
under clean---------
'; 
        $GLOBALS['_SESSION']=null;unset($GLOBALS['_SESSION']);//unset后,session会失效  
        empty($GLOBALS['_SESSION']) && ($GLOBALS['_SESSION']['qidiziReBuid'] = '1');//本句并不能重建/重触发session保存机制  
            session_write_close();//提前保存session改变,discuz清除了session导致保存机制失败,by qidizi,这句话才有效,提交保存  
        var_dump($_SESSION); 
        break; 

 


function userErrorHandler() {
    $e = func_get_args();
    echo '

<br/>----------运行出错---------:<br/>'.print_r($e, 1).'<br/>----------运行出错---------<br/>
登录后复制
';
}
set_error_handler("userErrorHandler");
set_exception_handler("userErrorHandler");

function shutdown() {
    $a=error_get_last();   
    if($a != null) echo '

<br/>++++++低级错误+++++<br/>'.print_r($a, 1).'<br/>++++++低级错误+++++<br/>
登录后复制
';  
}

register_shutdown_function('shutdown');//如果使用了exit将不运行此脚本


switch($_GET['how']) {
 case 's'://set
  session_start();
  $_SESSION['qidizi'] = rand();
  echo $_SESSION['qidizi'];
  break;
 case 'u'://unset
  session_start();
  $_SESSION['qidizi'] = 'qidiziUNSET';
  echo $_SESSION['qidizi'];
  break;
 case 'g'://get
  session_start();
  var_dump($_SESSION);
  break;
 case 'c'://clean
  session_start();
  echo 'get---------
';
  var_dump($_SESSION);
  echo '
edit-------/>';
  $_SESSION['qidizi'] = 'qidiziCLEAN';
  var_dump($_SESSION);
  echo '
under clean---------
';
  $GLOBALS['_SESSION']=null;unset($GLOBALS['_SESSION']);//unset后,session会失效
  empty($GLOBALS['_SESSION']) && ($GLOBALS['_SESSION']['qidiziReBuid'] = '1');//本句并不能重建/重触发session保存机制
   session_write_close();//提前保存session改变,discuz清除了session导致保存机制失败,by qidizi,这句话才有效,提交保存
  var_dump($_SESSION);
  break;
}
以上是测试代码

 


关键是在 $GLOBALS['_SESSION']=null; 这句.且

[php]
unset($GLOBALS['_SESSION']); 

unset($GLOBALS['_SESSION']);会让session在解析结束保存session的机制失败,看起来是这样的.不懂session自动保存的机制是怎么样的.演示代码中简单的重建并没有触发保存机制.

所以,后来我使用了提前调用方法提前保存我的session更改.


在discuz_application这个类中有对全局变量进行清空,

因为
正面面变量不需要保留,


    var $superglobal = array(
        'GLOBALS' => 1,
        '_GET' => 1,
        '_POST' => 1,
        '_REQUEST' => 1,
        '_COOKIE' => 1,
        '_SERVER' => 1,
        '_ENV' => 1,
        '_FILES' => 1,
    );

接着正面的代码就会对它进行清空

 

        foreach ($GLOBALS as $key => $value) {
            if (!isset($this->superglobal[$key])) {
                $GLOBALS[$key] = null; unset($GLOBALS[$key]);
            }
        }

最终效果出现如下的代码功能
关键是在 $GLOBALS['_SESSION']=null; 这句.

使用我上面的测试代码进行演示:
正面的说法指 local.q/t.php?how=s(设置)|g(获取)|u(修改)|c(清空)

操作步骤1 设置 -> 获取 -> 修改 -> 获取     ==== 结果,修改能反馈到获取时的结果中
操作步骤2 设置->获取 -> 修改-> 获取 -> 清空 -> 获取 ====结果:获取修改后数据正常.获取清空的数据失败,获取到的是修改时的数据.(注意这里的测试并没有把提前)

 

问题就是disucz的init方法导致清空相同的效果.导致某些情况下的使用session会出现清除不掉的问题.简单就是导致验证码输入一次就可以无限提交.

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 168
查看详情 文心大模型

虽然可以使用其它方法来防止.但是这个session的正常的机制被破坏了.问题比较多.

目前我在写这个时,还不清楚使用什么方法可以恢复它的机制.上面的尝试方法并不起作用.

 

 

 




 

 

 


经过测试发现使用 session_write_close();提前保存session理性.即可解决我遇到的问题,不知为何经过清空session后,自动保存会失效.需要主动保存.

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号