php语言 百分网手机站

PHP用Redis替代文件存储Session的方法

时间:2020-08-08 20:55:00 php语言 我要投稿

PHP用Redis替代文件存储Session的方法

  介绍了PHP使用Redis替代文件存储Session的方法,结合实例形式较为详细的分析了Session的基本操作方法及使用Redis存储session的相关技巧,需要的朋友可以参考下.

  本文实例讲述了PHP使用Redis替代文件存储Session的.方法。分享给大家供大家参考,具体如下:

  PHP默认使用文件存储session,如果并发量大,效率非常低。而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session。

  这里,介绍下php的session_set_save_handler 函数的作用和使用方法。该函数定义用户级session保存函数(如打开、关闭、写入等)。

  原型如下:

  bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)

  session_set_save_handler 函数各参数作用如下表

  参 数描述

  open当session打开时调用此函数。接收两个参数,第一个参数是保持session的路径,第二个参数是session的名字

  close当session操作完成时调用此函数。不接收参数。

  read以session ID作为参数。通过session ID从数据存储方中取得数据,并返回此数据。如果数据为空,可以返回一个空字符串。此函数在调用session_start 前被触发

  write当数据存储时调用。有两个参数,一个是session ID,另外一个是session的数据

  destroy当调用session_destroy 函数时触发destroy函数。只有一个参数 session ID

  gc当php执行session垃圾回收机制时触发

  在使用该函数前,先把php.ini配置文件的session.save_handler选项设置为user,否则session_set_save_handle 不会生效。

  编写一个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构造函数主要用来连接Redis服务器,使用session_set_save_handler函数设置session回调函数,并调用session_start函数开启session功能。因为本例中open、close和gc回调函数的作用不是很大,所以直接返回true。

  在write回调函数中,以session ID 作为key,把session的数据作为value存储到redis服务器,设置session的过期时间为30秒。在read 回调函中,以session ID 作为key从redis服务器中读取数据,并返回此数据。而在destroy回调函数重,则以session ID 作为key 从redis服务器中删除对应的session数据。

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

  ?

  1

  2

  3

  4

  <?php

  include('SessionManager.php');

  new SessionManager();

  $_SESSION['username'] = 'captain';

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

  <?php

  include('SessionManager.php');

  new SessionManager();

  echo $_SESSION['username'];

  测试时,首先访问session_set.php,然后再访问 session_get.php,输出结果如下所示:

  再查看redis数据库,如下所示

  127.0.0.1:6379> keys *

  1) "oe94eic337slnjv1bvlreoa574"

  127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574

  "username|s:7:\"captain\";"

【PHP用Redis替代文件存储Session的方法】相关文章:

用PHP读取文件的正确方法08-28

php读取文件内容的方法09-08

PHP读取文件的正确方法09-04

PHP语言中Session的概念11-12

Session在PHP中的使用09-16

php语言redis队列操作实例09-14

PHP中读取大文件的方法09-02

php中session的基础知识09-21

PHP文件是什么 如何打开PHP文件08-27

PHP中读取大文件实现方法09-05