其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

php Redis存储Session 【2】

GG网络技术分享 2025-03-18 16:17 0


<?php

/**

* Created by gather

* Email: chenruiqiang@yd-x.com

* Phone: 16601180687

* Copyright:源动互通(北京)科技有限公司

* Create Time: 2018/5/28 19:12

* 使用Redis管理session

*/

class redisSession{

/**

* 保存session的数据库表的信息

*/

private $_options = array(

\'handler\' => null, //数据库连接句柄

\'host\' => null,

\'port\' => null,

\'lifeTime\' => null,

\'prefix\' => \'PHPREDIS_SESSION:\'

);

/**

* 构造函数

* @param $options 设置信息数组

*/

public function __construct($options=array()){

if(!class_exists(\"redis\", false)){

die(\"必须安装redis扩展\");

}

if(!isset($options[\'lifeTime\']) || $options[\'lifeTime\'] <= 0){

$options[\'lifeTime\'] = ini_get(\'session.gc_maxlifetime\');

}

$this->_options = array_merge($this->_options, $options);

}

/**

* 开始使用该驱动的session

*/

public function begin(){

if($this->_options[\'host\'] === null ||

$this->_options[\'port\'] === null ||

$this->_options[\'lifeTime\'] === null

){

return false;

}

//设置session处理函数

session_set_save_handler(

array($this, \'open\'),

array($this, \'close\'),

array($this, \'read\'),

array($this, \'write\'),

array($this, \'destory\'),

array($this, \'gc\')

);

}

/**

* 自动开始回话或者session_start()开始回话后第一个调用的函数

* 类似于构造函数的作用

* @param $savePath 默认的保存路径

* @param $sessionName 默认的参数名,PHPSESSID

*/

public function open($savePath, $sessionName){

if(is_resource($this->_options[\'handler\'])) return true;

//连接redis

$redisHandle = new Redis();

$redisHandle->connect($this->_options[\'host\'], $this->_options[\'port\']);

if(!$redisHandle){

return false;

}

$this->_options[\'handler\'] = $redisHandle;

// $this->gc(null);

return true;

}

/**

* 类似于析构函数,在write之后调用或者session_write_close()函数之后调用

*/

public function close(){

return $this->_options[\'handler\']->close();

}

/**

* 读取session信息

* @param $sessionId 通过该Id唯一确定对应的session数据

* @return session信息/空串

*/

public function read($sessionId){

$sessionId = $this->_options[\'prefix\'].$sessionId;

return $this->_options[\'handler\']->get($sessionId);

}

/**

* 写入或者修改session数据

* @param $sessionId 要写入数据的session对应的id

* @param $sessionData 要写入的数据,已经序列化过了

*/

public function write($sessionId, $sessionData){

$sessionId = $this->_options[\'prefix\'].$sessionId;

return $this->_options[\'handler\']->setex($sessionId, $this->_options[\'lifeTime\'], $sessionData);

}

/**

* 主动销毁session会话

* @param $sessionId 要销毁的会话的唯一id

*/

public function destory($sessionId){

$sessionId = $this->_options[\'prefix\'].$sessionId;

// $array = $this->print_stack_trace();

// log::write($array);

return $this->_options[\'handler\']->delete($sessionId) >= 1 ? true : false;

}

/**

* 清理绘画中的过期数据

* @param 有效期

*/

public function gc($lifeTime){

//获取所有sessionid,让过期的释放掉

//$this->_options[\'handler\']->keys(\"*\");

return true;

}

//打印堆栈信息

public function print_stack_trace()

{

$array = debug_backtrace ();

//截取用户信息

$var = $this->read(session_id());

$s = strpos($var, \"index_dk_user|\");

$e = strpos($var, \"}authId|\");

$user = substr($var,$s+14,$e-13);

$user = unserialize($user);

//print_r($array);//信息很齐全

unset ( $array [0] );

if(!empty($user)){

$traceInfo = $user[\'id\'].\'|\'.$user[\'user_name\'].\'|\'.$user[\'user_phone\'].\'|\'.$user[\'presona_name\'].\'++++++++++++++++\\n\';

}else{

$traceInfo = \'++++++++++++++++\\n\';

}

$time = date ( \"y-m-d H:i:m\" );

foreach ( $array as $t ) {

$traceInfo .= \'[\' . $time . \'] \' . $t [\'file\'] . \' (\' . $t [\'line\'] . \') \';

$traceInfo .= $t [\'class\'] . $t [\'type\'] . $t [\'function\'] . \'(\';

$traceInfo .= implode ( \', \', $t [\'args\'] );

$traceInfo .= \")\\n\";

}

$traceInfo .= \'++++++++++++++++\';

return $traceInfo;

}

}

入口处调用

$handler = new redisSession(array(

\'host\' => \"127.0.0.1\",

\'port\' => \"6379\"

));

$handler->begin();

标签: 函数 信息

提交需求或反馈

Demand feedback