php中session資料庫儲存實例詳解

伊谢尔伦
發布: 2023-03-07 17:12:01
原創
2564 人瀏覽過

雖然透過改變Session 儲存資料夾使 Session 不至於填滿臨時資料夾而造成網站癱瘓,但可以計算一下,如果一個大型網站一天登入1000 人,一個月登陸了30000人,這時網站中存在30000 個Session 文件,然而要在這30000 個資料夾中查詢一個session_id 應該不是一件很輕鬆的事情,這個時候就需要應用到session 資料庫存儲, 也就是PHP 中的 session_set_save_handle( )函數。其語法格式如下:

session_set_save_handle(open, close, read, write, destroy,gc);
登入後複製

session_set_save_handle()函數的參數說明如下的形式:

參數說明
open(save_path, session_name)找到Session 儲存位址,取出變數名稱
#close()不需要參數,關閉資料庫
read(key)讀取Session 鍵值,key 對應session_id
write(key, data)其中data 對應設定的Session 變數
destroy(key) #註銷session 對應Session 鍵值
gc(expiry_time)清除過期的Session 記錄

一般應用參數直接使用變量,但是此函數中參數為6 個函數,而且在呼叫時只是呼叫函數名稱的字串。以下將分別介紹這幾個參數,最後將這些函數封裝到一個類別中。

(1)封裝session_open()函數,連接資料庫,其程式碼格式如下:

<?php
  function session_open($save_path,$session_name)
  {
     //连接 mysql 数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     // 判断数据库是否成功
     if(!$handle)
     {
        die(&#39;打开数据库失败&#39;);
     }
  }
?>
登入後複製

說明:在上面的程式碼中, $save_path和$session_name 兩個參數並沒有被使用,在這裡可以將這兩個參數去除,但是一般情況下還是建議朋友們保留輸入的這兩個參數,因為一般都會使用這兩個變數。

(2)封裝session_close()函數,關閉資料庫的連接,其程式碼格式如下:

<?php
  function session_close()
  {
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     mysqli_close($handle);
     return(true);
  }
?>
登入後複製

說明: 在這個函數中是不需要任何參數的,所以不論是Session 儲存到資料庫或檔案中,只要回傳true 即可。 但如果是 MYSQL 資料庫,最好是將資料庫關閉,以確保以後不會出現麻煩。

(3)封裝session_read()函數,在函數中設定目前時間的UNIX 時間戳,根據$key 值尋找Session 名稱及內容,其實例程式碼如下所示:

<?php
  function session_read($key)
  {
     //连接数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     //设定当前时间
     $time = time();
     $sql = "select session_date from tb_session where session_key=&#39;$key&#39;and session_time>$time ";
     $result = mysqli_query($handle,$sql);
     $row = mysqli_fetch_array($result);
     if($row)
     {   //返回 Session 名称和内容
        return($row[&#39;session_date&#39;]);
     }else{
        return(false);
     }
  }
?>
登入後複製

說明儲存進資料庫中的session_expiry 是UNIX 時間戳記。

(4)封裝 session_write()函數, 函數中設定了 Session 失效時間, 尋找 Session 名稱及內容。如果查詢的結果為空,則將目前頁面中的Session 根據session_id、session_name 、失效時間插入到資料庫中;如果查詢結果不為空,則根據$key 修改資料庫中Session 儲存信息,傳回執行的結果,其實例程式碼如下所示:

<?php
  function session_write($key,$data)
  {
     //连接数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     //设定失效时间
     $time = 60*60;
     // 得到 UNIX 时间戳
     $lapse_time = time() + $time;
     $sql = "select session_date from tb_session where session_key=&#39;$key&#39;and session_time>$lapse_time ";
     $result = mysqli_query($handle,$sql);
     if(mysqli_num_rows($result) == 0)  // 没有结果
     {    //插入数据库SQL语句
        $sql = "insert into tb_session values (&#39;$key&#39;,&#39;$data&#39;,$lapse_time)";
        $result = mysqli_query($handle,$sql);
     }else{
        // 修改数据库SQL语句
        $sql = "update tb_session set session_key=&#39;$key&#39;, sessoin_data=&#39;$data&#39;, session_time=$lapse_time where session_key=&#39;$key&#39; ";
        $result = mysqli_query($handle,$sql);
     }
     return($result);
  }
?>
登入後複製

(5)封裝 session_destroy()函數,根據$key 值將資料庫中 Session 刪除,其程式碼顯示如下:

<?php
  function session_destroy($key)
  {
     //连接数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     // 删除 Session 的 SQL 语句
     $sql = "delete from tb_session where session_key=&#39;$key&#39;";
     $result = mysqli_query($handle,$sql);
     return($result);
  }
?>
登入後複製

(6)封裝 session_gc()函數, 根據給定的失效時間刪除過期Session,其程式碼顯示如下:

<?php
  function session_gc($expiry_time)
  {
     //连接数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     // 将参数$expiry_time 赋值为当前时间戳
     $lapse_time = time();
     // 删除 Session 的 SQL 语句
     $sql = "delete from tb_session where expiry_time<$lapse_time";
     $result = mysqli_query($handle,$sql);
     return($result);
  }
?>
登入後複製

以上為session_set_save_handler()函數的6 個參數(函數) 。

下面透過函數 session_set_save_handler()實作 Session 儲存資料庫,實作的程式碼如下:

<?php session_set_save_handler(&#39;session_open&#39;,&#39;session_close&#39;,&#39;session_read&#39;,&#39;session_write&#39;,&#39;session_destroy&#39;,&#39;session_gc&#39;);
  session_start();
  // 下面为我们定义的 Session
  $_SESSION[&#39;user&#39;] = &#39;tom&#39;;
  $_SESSION[&#39;pwd&#39;] = &#39;12345&#39;;
?>
登入後複製

以上是php中session資料庫儲存實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板