Initial project files: BESCMS full source
This commit is contained in:
@@ -0,0 +1,178 @@
|
||||
<?php namespace Frame;
|
||||
|
||||
class Session
|
||||
{
|
||||
private $sessionStarted = false;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||
// 配置可按需调整
|
||||
if (!headers_sent()) {
|
||||
// 避免多处输出后再启动报错
|
||||
ini_set('session.use_strict_mode', '1');
|
||||
ini_set('session.cookie_httponly', '1');
|
||||
// 如需跨域或HTTPS,可在外部统一设置
|
||||
}
|
||||
@session_start();
|
||||
}
|
||||
$this->sessionStarted = (session_status() === PHP_SESSION_ACTIVE);
|
||||
|
||||
if (!isset($_SESSION['_tempdata']) || !is_array($_SESSION['_tempdata'])) {
|
||||
$_SESSION['_tempdata'] = [];
|
||||
}
|
||||
|
||||
$this->cleanupExpiredTempdata();
|
||||
}
|
||||
|
||||
// 设置常规会话数据(支持数组批量,或单个键值)
|
||||
public function set($key, $value = null)
|
||||
{
|
||||
if (!$this->sessionStarted) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_array($key)) {
|
||||
foreach ($key as $k => $v) {
|
||||
$_SESSION[$k] = $v;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
$_SESSION[$key] = $value;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 设置临时数据(带过期时间,单位秒)
|
||||
public function setTempdata($key, $value, $time)
|
||||
{
|
||||
if (!$this->sessionStarted) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$expire = time() + max(0, (int) $time);
|
||||
$_SESSION['_tempdata'][$key] = [
|
||||
'value' => $value,
|
||||
'expire' => $expire,
|
||||
];
|
||||
return true;
|
||||
}
|
||||
|
||||
// 获取临时数据($key 为 null 返回所有未过期临时数据)
|
||||
// 注意:读取不会删除;如需一次性使用,可调用 getTempdataOnce
|
||||
public function getTempdata($key = null)
|
||||
{
|
||||
if (!$this->sessionStarted) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$this->cleanupExpiredTempdata();
|
||||
|
||||
if ($key === null) {
|
||||
$result = [];
|
||||
foreach ($_SESSION['_tempdata'] as $k => $item) {
|
||||
$result[$k] = $item['value'];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
return isset($_SESSION['_tempdata'][$key]) ? $_SESSION['_tempdata'][$key]['value'] : null;
|
||||
}
|
||||
|
||||
// 一次性获取临时数据(读取后即删除)
|
||||
public function getTempdataOnce($key)
|
||||
{
|
||||
if (!$this->sessionStarted) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$this->cleanupExpiredTempdata();
|
||||
|
||||
if (!isset($_SESSION['_tempdata'][$key])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$value = $_SESSION['_tempdata'][$key]['value'];
|
||||
unset($_SESSION['_tempdata'][$key]);
|
||||
return $value;
|
||||
}
|
||||
|
||||
// 获取常规会话数据($key 为 null 返回所有)
|
||||
public function get($key = null)
|
||||
{
|
||||
if (!$this->sessionStarted) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($key === null) {
|
||||
$data = $_SESSION;
|
||||
unset($data['_tempdata']);
|
||||
return $data;
|
||||
}
|
||||
|
||||
return $_SESSION[$key] ?? null;
|
||||
}
|
||||
|
||||
// 移除常规会话数据(支持数组)
|
||||
public function remove($key)
|
||||
{
|
||||
if (!$this->sessionStarted) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_array($key)) {
|
||||
foreach ($key as $k) {
|
||||
if (array_key_exists($k, $_SESSION)) {
|
||||
unset($_SESSION[$k]);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (array_key_exists($key, $_SESSION)) {
|
||||
unset($_SESSION[$key]);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// 销毁会话(可选)
|
||||
public function destroy()
|
||||
{
|
||||
if (!$this->sessionStarted) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$_SESSION = [];
|
||||
if (ini_get('session.use_cookies')) {
|
||||
$params = session_get_cookie_params();
|
||||
setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
|
||||
}
|
||||
session_destroy();
|
||||
$this->sessionStarted = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 获取 Session ID(可选)
|
||||
public function getId()
|
||||
{
|
||||
return $this->sessionStarted ? session_id() : null;
|
||||
}
|
||||
|
||||
// 私有:清理过期临时数据
|
||||
private function cleanupExpiredTempdata()
|
||||
{
|
||||
if (empty($_SESSION['_tempdata']) || !is_array($_SESSION['_tempdata'])) {
|
||||
$_SESSION['_tempdata'] = [];
|
||||
return;
|
||||
}
|
||||
|
||||
$now = time();
|
||||
foreach ($_SESSION['_tempdata'] as $k => $item) {
|
||||
if (!isset($item['expire']) || $item['expire'] <= $now) {
|
||||
unset($_SESSION['_tempdata'][$k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user