phpcms用户退出却无法通知到ucenter的 BUG

用户模块  /modules/member/index.php        function logout()

首先PHPCMS的登出的代码里面有一句同步登出的语句:

$synlogoutstr = $this->client->ps_member_synlogout();

这个同步登出的代码是这样的:  modules/member/classes/client.class.php 大概第67行

    /**
     * 同步退出
     * @param string $uid
     * @return string javascript用户同步退出js
     */
    public function ps_member_synlogout() {
        return $this->_ps_send('synlogout', array());
    }

注意这里_ps_send的第二个参数是一个空的数组

再看到phpsso_server中phpsso类的构造函数:   phpsso_server/phpcms/modules/phpsso/classes/phpsso.class.php  大概第32行

if(isset($_POST["data'])) {  
    parse_str(sys_auth($_POST['data'], 'DECODE', $this->applist[$this->appid]['authkey']), $this->data);  
              
    if(emptyempty($this->data) || !is_array($this->data)) {  
        exit('0');  
    }  
} else {  
    exit('0');  
}  

这里对$this->data有一个判断,如果empty返回true就直接返回0不会再执行下面的同步退出代码了。而上面一步可以看到调用同步登出时传入的data参数恰恰就是array(),empty当然会返回true。于是调用同步退出就在这里终止。

问题的解决办法: 

知道了原因要想解决就很容易了,主要有两种。保险一点的方法是到ps_member_synlogout里面给那个空的数组随便增加一个元素。第二种就是去掉empty($this->data)这个判断。

原文地址:https://www.cnblogs.com/swinm/p/4165466.html