在实际业务中,当session存储过多 或者操作频繁,业务逐渐扩展的时候,文件存储已经无法满足session操作速度和需求,可以考虑用数据库或者nosql的redis来存储session,本文讲解如何用redis存储。数据库可以以此类推。
代码如下:
<?php global $redis;//声明全局变量redis $redis=new Redis();//实例化redis $redis->connect('127.0.0.1', 6379);//连接redis $redis->auth("redis的密码");//认证redis 请修改为你的密码 如果没有设置密码 注释该行代码 //从redis取数据 function get_redis($key) { global $redis;//声明全局变量redis return $redis->get($key);//get获取值 } //向redis存数据 function set_redis($key,$data,$expire_time=1800) { global $redis;//声明全局变量redis $redis->set($key,$data,$expire_time);//set设置值 } //开启session function sess_open() { } //关闭session function sess_close() { } //读取session sess_id就是 session_id function sess_read($sess_id) { $val=get_redis($sess_id); return(unserialize($val)); } //写入session sess_id就是 session_id sess_data就是session的整个数据 function sess_write($sess_id, $sess_data) { set_redis($sess_id,serialize($sess_data)); session_commit(); } //清除session function sess_destroy() { } function sess_gc() { } //声明重写 session_set_save_handler( 'sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc' ); session_start(); $_SESSION['user']=array("name"=>"hello","tel"=>"world"); register_shutdown_function('session_write_close');//注册事件 页面结束写入session 关闭session exit(); ?>
redis管理工具中看到的截图
同样的,如果是数据库存储的话,可以建立一个 key value的数据库 session_id session_data两个字段就够了用来存储和更新。
Tips:session不采用文件存储还有一个好处 就是能够跨站共享,因为session被存储到后端的nosql数据库了,只要都连接这个后端数据,就能够共享session