<?php
namespace Support\Extends\Session;
use Facade\RedisWorker;
use RedisException;
class Session
{
public string $key;
public array $data = [];
public bool $isChanged = false;
public int $startTime = 0;
public int $expire = 0;
public SessionManager $sessionManager;
public function __construct(string $key, SessionManager $sessionManager)
{
$this->key = $key;
$this->sessionManager = $sessionManager;
$this->startTime = time();
}
public function __destruct()
{
$this->startTime = time();
$this->save();
}
public function __wakeup()
{
$this->isChanged = false;
}
public function save(): void
{
if ($this->sessionManager->type === SessionManager::TYPE_FILE) {
file_put_contents("{$this->sessionManager->filePath}/session_{$this->sessionManager->prefix}_{$this->key}", serialize($this));
} else {
$sessionKey = "p:session_{$this->sessionManager->prefix}_{$this->key}";
RedisWorker::getClient($this->sessionManager->redisName)->set($sessionKey, serialize($this));
}
}
public function set(string $key, mixed $value): void
{
$this->data[$key] = $value;
$this->isChanged = true;
}
public function delete(string $key): void
{
unset($this->data[$key]);
$this->isChanged = true;
}
public function clear(): void
{
$this->data = [];
$this->isChanged = true;
}
public function get(string $key, mixed $default = null): mixed
{
return $this->data[$key] ?? $default;
}
}