一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 將PHP的session數據存儲到數據庫中的代碼實例

將PHP的session數據存儲到數據庫中的代碼實例

2021-01-29 16:42烏龜殼 PHP教程

這里我們將分享兩個將PHP的session數據存儲到數據庫中的代碼實例,分別針對PostgreSQL與MySQL,需要的朋友可以參考下

一個開發環境有多個網站,需要使用不同的session,解決方案很多。不過這次也高大上一把,用數據庫存,方便以后擴展。

PostgreSQL版
首先是數據庫的部分

?
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
--drop table php_session
create unlogged table php_session
(
  sess_id varchar(32) primary key,
  modify_time timestamp with time zone not null,
  sess_data varchar(3000) default ''
);
 
create index concurrently idx_php_session_modify_time on php_session(modify_time);
 
--set_session(id, data)
create or replace function set_session(varchar, varchar) returns void as $set_session$
  with upsert as (
    update php_session
    set modify_time = current_timestamp, sess_data = $2
    where sess_id = $1
    returning 1
  )
  insert into php_session (sess_id, modify_time, sess_data)
  select $1, current_timestamp, $2
  where not exists (
    select 1 from upsert
  );
$set_session$ language sql;
 
--get_session(id)
create or replace function get_session(varchar) returns varchar as $get_session$
  select sess_data from php_session where sess_id = $1
$get_session$ language sql;
 
--del_session
create or replace function del_session(varchar) returns void as $del_session$
  delete from php_session where sess_id = $1
$del_session$ language sql;
 
--gc_session
create or replace function gc_session() returns void as $del_session$
  delete from php_session where modify_time < current_timestamp - interval '30 days'
$del_session$ language sql;

然后是PHP的部分

?
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
<?php
 
session_set_save_handler(
  function ($savePath, $sessionName) {//open
    return true;
  },
  function () {//close
    return true;
  },
  function ($id) {//read
    $sql = "select get_session($1)";
    $stmt = pg_query_params(SESSION_CONN, $sql, array($id));
    $result = pg_fetch_row($stmt);
    
    return $result[0];
  },
  function ($id, $data) {//write
    $sql = "select set_session($1, $2)";
    pg_query_params(SESSION_CONN, $sql, array($id, $data));
    return true;
  },
  function ($id) {//destroy
    $sql = "select del_session($1)";
    pg_query_params(SESSION_CONN, $sql, array($id, $data));
    return true;
  },
  function ($maxlifetime) {//gc
    //php needn't control the global session gc
    return true;
  }
);
 
register_shutdown_function('session_write_close');
 
?>

然后只要在session_start之前調用這個就可以了

至于SESSION_CONN,那是我定義的一個常量,表示一個指向session數據庫的鏈接而已。

MySQL版
再總結一個針對MySQL的集成更多基礎功能的例子:
表結構:

?
1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `sessioninfo` (
`sid` varchar(255) NOT NULL,
`value` text NOT NULL,
`expiration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

session信息存儲到數據庫的類:

?
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
class MySessionHandler implements SessionHandlerInterface {
 
  /**
  * @access private
  * @var object 數據庫連接
  */
  private $_dbLink;
  /**
  * @access private
  * @var string 保存session的表名
  */
  Private $_sessionTable;
  /**
  * @access private
  * @var string session名
  */
  private $_sessionName;
  /**
  * @const 過期時間
  */
  const SESSION_EXPIRE = 10;
 
  public function __construct($dbLink, $sessionTable) {
    if(!is_object($dbLink)) {
      return false;
    }
    $this->_dbLink = $dbLink;
    $this->_sessionTable = $sessionTable;
  }
 
  /**
  * 打開
  * @access public
  * @param string $session_save_path 保存session的路徑
  * @param string $session_name session名
  * @return integer
  */
  public function open($session_save_path, $session_name) {
    $this->_sessionName = $session_name;
    return 0;
  }
 
  /**
  * 關閉
  * @access public
  * @return integer
  */
  public function close() {
    return 0;
  }
 
  /**
  * 關閉session
  * @access public
  * @param string $session_id session ID
  * @return string
  */
  public function read($session_id) {
    $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = {$session_id} AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";
    $result = $this->_dbLink->query($query);
    if(!isset($value) || empty($value)) {
      $value = "";
      return $value;
    }
    $this->_dbLink->query("UPDATE {$this->_sessionTable} SET expiration = CURRENT_TIMESTAMP() WHERE sid = {$session_id}");
    $value = $result->fetch_array();
    $result->free();
    return $value['value'];
  }
 
  /**
  * 寫入session
  * @access public
  * @param string $session_id session ID
  * @param string $session_data session data
  * @return integer
  */
  public function write($session_id, $session_data) {
    $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";
    $result = $this->_dbLink->query($query);
    $result = $result->fetch_array();
    if(!empty($result)) {
      $result = $this->_dbLink->query("UPDATE {$this->_sessionTable} SET value = {$session_data} WHERE sid = {$session_id}");
    }
    else{
      $result = $this->_dbLink->query("INSERT INTO {$this->_sessionTable} (sid, value) VALUES ('{$session_id}', '{$session_data}')");
    }
    if($result){
      return 0;
    }
    else{
      return 1;
    }   
  }
 
  /**
  * 銷魂session
  * @access public
  * @param string $session_id session ID
  * @return integer
  */
  public function destroy($session_id) {
    $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE sid = '{$session_id}'");
    if($result){
      return 0;
    }
    else{
      return 1;
    }
  }
 
  /**
  * 垃圾回收
  * @access public
  * @param string $maxlifetime session 最長生存時間
  * @return integer
  */
  public function gc($maxlifetime) {
    $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE UNIX_TIMESTAMP(expiration) < UNIX_TIMESTAMP(NOW()) - " . self::SESSION_EXPIRE);
    if($result){
      return 0;
    }
    else{
      return 1;
    }
  }
 
}
?
1
2
3
4
5
6
7
8
9
$dbLink = new mysqli("localhost", "root", "root", "test");
$sessionTable = "sessioninfo";
 
$handler = new MySessionHandler($dbLink, $sessionTable);
session_set_save_handler($handler);
session_start();
$_SESSION['name'] = "test";
echo $_SESSION["name"];
//session_destroy();

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天海翼三级 | 天天操网 | 日韩一品在线播放视频一品免费 | 国产久热精品 | 亚洲国产精品嫩草影院永久 | 91插视频 | 草榴色导航 | 2019年国产高清情侣视频 | 美女在尿口隐私视频 | 欧美一区高清 | 男女肉文高h | 美国videos| 手机看片自拍自自拍日韩免费 | 国产成人高清精品免费5388密 | 国产成人理在线观看视频 | 视频在线免费看 | 调教老师肉色丝袜的故事 | 日韩精品成人a在线观看 | 国产美女极品免费视频 | h肉动漫在线视频无修无遮挡 | 日本xxxxxxxxx高清hd | 好姑娘完整版在线观看中文 | 2019国内自拍| 国产精品资源在线观看网站 | 久青草国产观看在线视频 | 婷婷伊人综合亚洲综合网 | 疯狂激吻添下边小说 | 久久re热在线视频精69 | 婷婷久久综合 | 国产ab | 毛片免费毛片一级jjj毛片 | 99热这里有精品 | 欧美日韩国产亚洲一区二区 | 99久久免费国产香蕉麻豆 | 亚洲女人国产香蕉久久精品 | 啪啪免费入口网站 | 久久视频精品3线视频在线观看 | 国产成人精品系列在线观看 | 黑人巨大vs北条麻妃在线 | 亚洲国产福利精品一区二区 | 色婷婷久久综合中文久久一本` |