PHP 7.4 session_set_save_handler删除旧数据会话

问题描述

我目前正在学习PHP,并尝试创建一个类以每60秒重新生成一个session_id。我已经在Apache24,PHP 7.4环境中进行了设置。

刷新浏览器时,旧会话的所有数据都会丢失,条件(!isset($this->sessionStartTime))TRUE

if (!isset($this->sessionStartTime)) {
    $this->sessionStartTime = time();
}
if ((time() - $this->sessionStartTime) > ($this->ttl)) {
    $this->sessionStartTime = time();
    return session_regenerate_id(true);

但是如果我删除功能

session_set_save_handler($this,true);

成功重新生成了会话,但是数据会话未得到安全保护,并且未调用函数write($session_id,$session_data)

(希望这不是所提任何其他问题的重复。在Stackoverflow和Google上进行了大量搜索,但没有找到解决我挑战的答案)

我的会话处理程序代码如下:

<?PHP

define('SESSION_SAVE_PATH',dirname(realpath(__FILE__)) . DIRECTORY_SEParaTOR . 'sessions');

class AppSessionHandler extends SessionHandler
{
    private $sessionName = 'MYAPPSESS';
    private $sessionMaxLifeTime = 0;
    private $sessionSSL = False;
    private $sessionHTTPOnly = True;
    private $sessionPath = '/';
    private $sessionDomain = '.test.at';
    private $sessionSavePath = SESSION_SAVE_PATH;

    private $sessionCipherAlgo = MCRYPT_BLOWFISH;
    private $sessionCipherMode = MCRYPT_MODE_ECB;
    private $sessionCipherKey  = 'WYCRYPT0K3Y02016';

    private $ttl = 60;

    public function __construct()
    {
        ini_set('session.use_cookies',1);
        ini_set('session.use_only_cookies',1);
        ini_set('session.use_trans_sid',0);
        ini_set('session.save_handler','files');

        session_name($this->sessionName);

        session_save_path($this->sessionSavePath);

        session_set_cookie_params(
            $this->sessionMaxLifeTime,$this->sessionPath,$this->sessionDomain,$this->sessionSSL,$this->sessionHTTPOnly
        );

        session_set_save_handler($this,true);
    }

    public function __get($key)
    {
        return false !== $_SESSION[$key] ? $_SESSION[$key] : false;
    }

    public function  __set($key,$value)
    {
        $_SESSION[$key] = $value;
    }

    public function __isset($key){
        return isset($_SESSION[$key]) ? true : false;
    }

    public function read($session_id)
    {
        return mcrypt_encrypt($this->sessionCipherAlgo,$this->sessionCipherKey,parent::read($session_id),$this->sessionCipherMode);
    }

    public function write($session_id,$session_data)
    {
        return parent::write($session_id,mcrypt_encrypt($this->sessionCipherAlgo,$session_data,$this->sessionCipherMode));
    }

    public function start()
    {
        if ('' === session_id()) {
            if (session_start()) {
                if (!isset($this->sessionStartTime)) {
                    $this->sessionStartTime = time();
                }
                if ((time() - $this->sessionStartTime) > ($this->ttl)) {
                    $this->sessionStartTime = time();
                    return session_regenerate_id(true);
                }
            }
        }
    }
}

$session = new AppSessionHandler();
$session->start();

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)