just do it

Session入库(修改session的存储机制)

1.首先了解一下session文件的默认保存位置

php.ini session.save_path 默认为操作系统的临时目录

注: 防止session文件过多 检索速度变慢 设置session多目录

a.通过session.save_path 设置采用几级目录 1表示一级

Php.ini  session.save_path = “1;e:/amp/temp”

b.手动创建子目录

会根据当前sessionid的值 选取使用哪个子目录来保存session文件

如果采用的是多级子目录的化,采取sessionid的相应字母作为子目录的名称

但是 在实际开发中,还是很少使用以上方法 来解决网站的大量session数据的问题

现在的瓶颈是 文件系统的 文件访问 速度是相对较慢的

在实际的开发中 我们可以将session数据保存在内存中(memcache)

除了保存到内存中,还有一个可以采取的方法,保存到数据库里(session入库)。

 

2.session入库

我们只是修改 session存储相关的部分,用法是不变的。

利用函数session_set_save_handler(),即可完成

先了解一下session的处理流程:

《Session入库(修改session的存储机制)》

执行流程:

Session_start() [open,read,gc]

获得sessonid (浏览器自带,服务器生成) php获得

Sess_open()初始化 连接数据库资源 mysql会自动找到当前已经连接的资源

不涉及作用域问题

Sess_read( ) 从存储介质 读取session信息

Sess_gc()  垃圾回收 随机

注:
让gc垃圾回收函数运行起来:
gc函数并不是手动调用。是在 session_start()时,有机会自动地被调用。机会 是通过2个参数配置的一个比例。
Session.gc_probobility 可能
Session.gc_devisor 除数
Session.gc_probobility / Session.gc_devisor

Sess_destory  销毁存储介质上的session数据(手动调用session_destory)

一旦调用此函数在页面结束时 不再进行 write 操作。

Sess_write 将当前脚本session[]数组 信息(php已序列化)写入 存储介质 脚本结束时调用(但是 脚本内执行session_destory 此方法就不会被执行

Sess_close  释放资源

相关代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
function sess_read($sess_id) {
    echo 'read';
    //查询的sql语句
    $query = "select sess_data from sessions where sess_id='{$sess_id}'";
    $result = mysql_query($query);
    $row = mysql_fetch_assoc($result);
    //返回查询到的数据
    return $row['sess_data'];
 
}
 
//写方法
/**
 * @param $sess_id string 当前的sessionID
 * @param $sess_data string 当前的session数据,(序列化好的)
 */
function sess_write($sess_id, $sess_data) {
    echo 'write';
    //应该考虑到 当前的session记录是否存在
    //存在应该update更新,不存在应该insert新建
    $expire = time();
    $query = "insert into sessions values ('{$sess_id}', '{$sess_data}', {$expire}) on duplicate key update sess_data='{$sess_data}', expire={$expire}";
    return mysql_query($query);
 
}
 
/**
 *session_start 是执行的方法,用户初始化资源
 * @param $save_path string php.ini中 session.save_path 的值。
 * @param $sess_name string php.ini中 session.name 的值。ini_get()也可以获得。
 */
function sess_open($save_path, $sess_name) {
    echo 'open';
    //连接上数据库
    $link = mysql_connect('localhost', 'root', '1234abcd');
    mysql_query('use test', $link);
    mysql_query('set names utf8');
}
 
/**
 *在最后,释放资源的方法
 */
function sess_close() {
//    echo 'close';
    mysql_close();
}
/**
 * @param $sess_id string 当前的sessionID
 */
function sess_destroy($sess_id) {
    echo 'destroy';
    $query = "delete from sessions where sess_id='{$sess_id}'";
    return mysql_query($query);
 
}
/**
 *负责回收垃圾的函数
 *@param $ttl 当前的session数据的最大生存周期
 */
function sess_gc($ttl) {
    //
//    echo 'gc';
    $expire = time() - $ttl;
    $query = "delete from sessions where expire < {$expire}";     return mysql_query($query); } //将我们的方法 告知给当前的session系统 //利用函数 session_set_save_handler(); //session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc'); //开启session session_start(); class sessionsTable extends mysqlDB {     protected $table_name = 'sessions';     protected $fields;     public function __construct() {         //调用父类的构造方法         parent::__construct();         //设置session处理器         session_set_save_handler(             array($this, 'open'),             array($this, 'close'),             array($this, 'read'),             array($this, 'write'),             array($this, 'destroy'),             array($this, 'gc')         );         //开启session         session_start();     }     public function open($save_path, $sess_name) {         return true;     }     public function close() {         return true;     }     public function read($sess_id) {         $query = "select sess_data from cz_sessions where sess_id='{$sess_id}'";         $row = $this->getRow($query);
        return $row['sess_data'];
 
    }
    public function write($sess_id, $sess_data) {
        $expire = time();
        $query = "insert into cz_sessions values ('{$sess_id}', '{$sess_data}', {$expire}) on duplicate key update sess_data='{$sess_data}', expire={$expire}";
        return $this->query($query);
    }
    public function destroy($sess_id) {
        $query = "delete from cz_sessions where sess_id='{$sess_id}'";
        return $this->query($query);
    }
    public function gc($ttl) {
        $expire = time() - $ttl;
        $query = "delete from cz_sessions where expire < {$expire}";         return $this->query($query);
    }
}
 
new sessionsTable();
点赞