PHP Session的优化使用

时间:2023-02-05 22:22:32

前言

首先说一下,原版session实际并不是很烂,如果你的项目不是高并发项目,完全可以使用原版session。

PHP默认的session是以文件形式保存在本地磁盘上的,每次访问实际就是一次io操作,并发大时必定会影响服务器速度。

使用cookie代替session,这个我也不太建议,首先cookie是保存在客户端上的,很容易被篡改,如果使用加密确保cookie的完整性,那么cookie保存的数据就会变得越多,就越容易消耗带宽。

而使用内存代替文件储存session就成为现在的主流。

使用Redis替代文件存储Session

session_set_save_handler 该函数定义用户级session保存函数(如打开、关闭、写入等)。

编写一个session管理类sessionManager.php ,代码如下:

<?php
class SessionManager{
private $redis;
private $sessionSavePath;
private $sessionName;
private $sessionExpireTime=30;//redis,session的过期时间为30s
public function __construct(){
$this->redis = new Redis();//创建phpredis实例
$this->redis->connect('127.0.0.1',6379);//连接redis
$this->redis->auth("107lab");//授权
$retval = session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destroy"),
array($this,"gc")
);
session_start();
}
public function open($path,$name){
return true;
}
public function close(){
return true;
}
public function read($id){
$value = $this->redis->get($id);//获取redis中的指定记录
if($value){
return $value;
}else{
return '';
}
}
public function write($id,$data){
if($this->redis->set($id,$data)){//以session ID为键,存储
$this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
return true;
}
return false;
}
public function destroy($id){
if($this->redis->delete($id)){//删除redis中的指定记录
return true;
}
return false;
}
public function gc($maxlifetime){
return true;
}
public function __destruct(){
session_write_close();
}
}

使用时,只需包含SessionManager类,然后实例化一个SessionManager对象。下面建立个session_set.php文件。

<?php
include('SessionManager.php');
new SessionManager();
$_SESSION['username'] = 'captain';

然后再创建一个session_get.php文件,输入如下代码:

<?php
include('SessionManager.php');
new SessionManager();
echo $_SESSION['username'];
//print captain