You've already forked qlg.tsgz.moe
addons
app_download_files
extend
hyhproject
mobile
oss
static
thinkphp
lang
library
think
cache
config
controller
db
debug
exception
log
model
paginator
process
response
session
template
view
App.php
Build.php
Cache.php
Collection.php
Config.php
Console.php
Controller.php
Cookie.php
Db.php
Debug.php
Env.php
Error.php
Exception.php
File.php
Hook.php
Lang.php
Loader.php
Log.php
Model.php
Paginator.php
Process.php
Request.php
Response.php
Route.php
Session.php
Template.php
Url.php
Validate.php
View.php
traits
tpl
.htaccess
LICENSE.txt
README.md
base.php
convention.php
helper.php
logo.png
start.php
upload
vendor
wxtmp
.gitignore
.htaccess
.user.ini
404.html
H5436787D.wgt
admin.php
app-release.apk
app_download.html
cash.lock
demo.php
get_version.php
get_version_new.php
index.html
index.php
reg.lock
robots.txt
367 lines
11 KiB
PHP
Executable File
367 lines
11 KiB
PHP
Executable File
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
|
// +----------------------------------------------------------------------
|
|
// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
|
|
// +----------------------------------------------------------------------
|
|
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
|
// +----------------------------------------------------------------------
|
|
// | Author: liu21st <liu21st@gmail.com>
|
|
// +----------------------------------------------------------------------
|
|
|
|
namespace think;
|
|
|
|
use think\exception\ClassNotFoundException;
|
|
|
|
class Session
|
|
{
|
|
protected static $prefix = '';
|
|
protected static $init = null;
|
|
|
|
/**
|
|
* 设置或者获取session作用域(前缀)
|
|
* @param string $prefix
|
|
* @return string|void
|
|
*/
|
|
public static function prefix($prefix = '')
|
|
{
|
|
empty(self::$init) && self::boot();
|
|
if (empty($prefix) && null !== $prefix) {
|
|
return self::$prefix;
|
|
} else {
|
|
self::$prefix = $prefix;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* session初始化
|
|
* @param array $config
|
|
* @return void
|
|
* @throws \think\Exception
|
|
*/
|
|
public static function init(array $config = [])
|
|
{
|
|
if (empty($config)) {
|
|
$config = Config::get('session');
|
|
}
|
|
// 记录初始化信息
|
|
App::$debug && Log::record('[ SESSION ] INIT ' . var_export($config, true), 'info');
|
|
$isDoStart = false;
|
|
if (isset($config['use_trans_sid'])) {
|
|
ini_set('session.use_trans_sid', $config['use_trans_sid'] ? 1 : 0);
|
|
}
|
|
|
|
// 启动session
|
|
if (!empty($config['auto_start']) && PHP_SESSION_ACTIVE != session_status()) {
|
|
ini_set('session.auto_start', 0);
|
|
$isDoStart = true;
|
|
}
|
|
|
|
if (isset($config['prefix']) && ('' === self::$prefix || null === self::$prefix)) {
|
|
self::$prefix = $config['prefix'];
|
|
}
|
|
if (isset($config['var_session_id']) && isset($_REQUEST[$config['var_session_id']])) {
|
|
session_id($_REQUEST[$config['var_session_id']]);
|
|
} elseif (isset($config['id']) && !empty($config['id'])) {
|
|
session_id($config['id']);
|
|
}
|
|
if (isset($config['name'])) {
|
|
session_name($config['name']);
|
|
}
|
|
if (isset($config['path'])) {
|
|
session_save_path($config['path']);
|
|
}
|
|
if (isset($config['domain'])) {
|
|
ini_set('session.cookie_domain', $config['domain']);
|
|
}
|
|
if (isset($config['expire'])) {
|
|
ini_set('session.gc_maxlifetime', $config['expire']);
|
|
ini_set('session.cookie_lifetime', $config['expire']);
|
|
}
|
|
if (isset($config['secure'])) {
|
|
ini_set('session.cookie_secure', $config['secure']);
|
|
}
|
|
if (isset($config['httponly'])) {
|
|
ini_set('session.cookie_httponly', $config['httponly']);
|
|
}
|
|
if (isset($config['use_cookies'])) {
|
|
ini_set('session.use_cookies', $config['use_cookies'] ? 1 : 0);
|
|
}
|
|
if (isset($config['cache_limiter'])) {
|
|
session_cache_limiter($config['cache_limiter']);
|
|
}
|
|
if (isset($config['cache_expire'])) {
|
|
session_cache_expire($config['cache_expire']);
|
|
}
|
|
if (!empty($config['type'])) {
|
|
// 读取session驱动
|
|
$class = false !== strpos($config['type'], '\\') ? $config['type'] : '\\think\\session\\driver\\' . ucwords($config['type']);
|
|
|
|
// 检查驱动类
|
|
if (!class_exists($class) || !session_set_save_handler(new $class($config))) {
|
|
throw new ClassNotFoundException('error session handler:' . $class, $class);
|
|
}
|
|
}
|
|
if ($isDoStart) {
|
|
session_start();
|
|
self::$init = true;
|
|
} else {
|
|
self::$init = false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* session自动启动或者初始化
|
|
* @return void
|
|
*/
|
|
public static function boot()
|
|
{
|
|
if (is_null(self::$init)) {
|
|
self::init();
|
|
} elseif (false === self::$init) {
|
|
if (PHP_SESSION_ACTIVE != session_status()) {
|
|
session_start();
|
|
}
|
|
self::$init = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* session设置
|
|
* @param string $name session名称
|
|
* @param mixed $value session值
|
|
* @param string|null $prefix 作用域(前缀)
|
|
* @return void
|
|
*/
|
|
public static function set($name, $value = '', $prefix = null)
|
|
{
|
|
empty(self::$init) && self::boot();
|
|
|
|
$prefix = !is_null($prefix) ? $prefix : self::$prefix;
|
|
if (strpos($name, '.')) {
|
|
// 二维数组赋值
|
|
list($name1, $name2) = explode('.', $name);
|
|
if ($prefix) {
|
|
$_SESSION[$prefix][$name1][$name2] = $value;
|
|
} else {
|
|
$_SESSION[$name1][$name2] = $value;
|
|
}
|
|
} elseif ($prefix) {
|
|
$_SESSION[$prefix][$name] = $value;
|
|
} else {
|
|
$_SESSION[$name] = $value;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* session获取
|
|
* @param string $name session名称
|
|
* @param string|null $prefix 作用域(前缀)
|
|
* @return mixed
|
|
*/
|
|
public static function get($name = '', $prefix = null)
|
|
{
|
|
empty(self::$init) && self::boot();
|
|
$prefix = !is_null($prefix) ? $prefix : self::$prefix;
|
|
if ('' == $name) {
|
|
// 获取全部的session
|
|
$value = $prefix ? (!empty($_SESSION[$prefix]) ? $_SESSION[$prefix] : []) : $_SESSION;
|
|
} elseif ($prefix) {
|
|
// 获取session
|
|
if (strpos($name, '.')) {
|
|
list($name1, $name2) = explode('.', $name);
|
|
$value = isset($_SESSION[$prefix][$name1][$name2]) ? $_SESSION[$prefix][$name1][$name2] : null;
|
|
} else {
|
|
$value = isset($_SESSION[$prefix][$name]) ? $_SESSION[$prefix][$name] : null;
|
|
}
|
|
} else {
|
|
if (strpos($name, '.')) {
|
|
list($name1, $name2) = explode('.', $name);
|
|
$value = isset($_SESSION[$name1][$name2]) ? $_SESSION[$name1][$name2] : null;
|
|
} else {
|
|
$value = isset($_SESSION[$name]) ? $_SESSION[$name] : null;
|
|
}
|
|
}
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* session获取并删除
|
|
* @param string $name session名称
|
|
* @param string|null $prefix 作用域(前缀)
|
|
* @return mixed
|
|
*/
|
|
public static function pull($name, $prefix = null)
|
|
{
|
|
$result = self::get($name, $prefix);
|
|
if ($result) {
|
|
self::delete($name, $prefix);
|
|
return $result;
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* session设置 下一次请求有效
|
|
* @param string $name session名称
|
|
* @param mixed $value session值
|
|
* @param string|null $prefix 作用域(前缀)
|
|
* @return void
|
|
*/
|
|
public static function flash($name, $value)
|
|
{
|
|
self::set($name, $value);
|
|
if (!self::has('__flash__.__time__')) {
|
|
self::set('__flash__.__time__', $_SERVER['REQUEST_TIME_FLOAT']);
|
|
}
|
|
self::push('__flash__', $name);
|
|
}
|
|
|
|
/**
|
|
* 清空当前请求的session数据
|
|
* @return void
|
|
*/
|
|
public static function flush()
|
|
{
|
|
if (self::$init) {
|
|
$item = self::get('__flash__');
|
|
|
|
if (!empty($item)) {
|
|
$time = $item['__time__'];
|
|
if ($_SERVER['REQUEST_TIME_FLOAT'] > $time) {
|
|
unset($item['__time__']);
|
|
self::delete($item);
|
|
self::set('__flash__', []);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除session数据
|
|
* @param string|array $name session名称
|
|
* @param string|null $prefix 作用域(前缀)
|
|
* @return void
|
|
*/
|
|
public static function delete($name, $prefix = null)
|
|
{
|
|
empty(self::$init) && self::boot();
|
|
$prefix = !is_null($prefix) ? $prefix : self::$prefix;
|
|
if (is_array($name)) {
|
|
foreach ($name as $key) {
|
|
self::delete($key, $prefix);
|
|
}
|
|
} elseif (strpos($name, '.')) {
|
|
list($name1, $name2) = explode('.', $name);
|
|
if ($prefix) {
|
|
unset($_SESSION[$prefix][$name1][$name2]);
|
|
} else {
|
|
unset($_SESSION[$name1][$name2]);
|
|
}
|
|
} else {
|
|
if ($prefix) {
|
|
unset($_SESSION[$prefix][$name]);
|
|
} else {
|
|
unset($_SESSION[$name]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清空session数据
|
|
* @param string|null $prefix 作用域(前缀)
|
|
* @return void
|
|
*/
|
|
public static function clear($prefix = null)
|
|
{
|
|
empty(self::$init) && self::boot();
|
|
$prefix = !is_null($prefix) ? $prefix : self::$prefix;
|
|
if ($prefix) {
|
|
unset($_SESSION[$prefix]);
|
|
} else {
|
|
$_SESSION = [];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 判断session数据
|
|
* @param string $name session名称
|
|
* @param string|null $prefix
|
|
* @return bool
|
|
*/
|
|
public static function has($name, $prefix = null)
|
|
{
|
|
empty(self::$init) && self::boot();
|
|
$prefix = !is_null($prefix) ? $prefix : self::$prefix;
|
|
if (strpos($name, '.')) {
|
|
// 支持数组
|
|
list($name1, $name2) = explode('.', $name);
|
|
return $prefix ? isset($_SESSION[$prefix][$name1][$name2]) : isset($_SESSION[$name1][$name2]);
|
|
} else {
|
|
return $prefix ? isset($_SESSION[$prefix][$name]) : isset($_SESSION[$name]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 添加数据到一个session数组
|
|
* @param string $key
|
|
* @param mixed $value
|
|
* @return void
|
|
*/
|
|
public static function push($key, $value)
|
|
{
|
|
$array = self::get($key);
|
|
if (is_null($array)) {
|
|
$array = [];
|
|
}
|
|
$array[] = $value;
|
|
self::set($key, $array);
|
|
}
|
|
|
|
/**
|
|
* 启动session
|
|
* @return void
|
|
*/
|
|
public static function start()
|
|
{
|
|
session_start();
|
|
self::$init = true;
|
|
}
|
|
|
|
/**
|
|
* 销毁session
|
|
* @return void
|
|
*/
|
|
public static function destroy()
|
|
{
|
|
if (!empty($_SESSION)) {
|
|
$_SESSION = [];
|
|
}
|
|
session_unset();
|
|
session_destroy();
|
|
self::$init = null;
|
|
}
|
|
|
|
/**
|
|
* 重新生成session_id
|
|
* @param bool $delete 是否删除关联会话文件
|
|
* @return void
|
|
*/
|
|
public static function regenerate($delete = false)
|
|
{
|
|
session_regenerate_id($delete);
|
|
}
|
|
|
|
/**
|
|
* 暂停session
|
|
* @return void
|
|
*/
|
|
public static function pause()
|
|
{
|
|
// 暂停session
|
|
session_write_close();
|
|
self::$init = false;
|
|
}
|
|
}
|