咱們知道,session是一種會話技術,用來實現跨腳本共享數據。php
在以前的php會話技術中咱們介紹過,session是存放在服務器端的文件裏的,所以session有可能由於文件數量過多,會在查詢session文件以及讀取的時候產生壓力。通常咱們有三種解決方案mysql
1.使用文件分層(缺點:I/O操做是系統的一個瓶頸,即便分層也不能避免此問題)sql
2.將session放入數據庫數據庫
3.將session放在內存中(非關係性數據庫)(缺點:對服務器內存要求教高)數組
所以咱們選用一個折中的辦法,將session存入mysql數據庫,也就是咱們要講的重點,服務器
session入庫技術:session
要實現session入庫,首先咱們要了解session 機制:函數
什麼是session機制:fetch
在php中,session能夠理解爲一套單獨的小系統,在該系統中有不少關於session的處理方法,用來解決各類問題,用戶只須要在session以外,調用session_start函數(session系統的一個接口)spa
其餘操做都是session系統幫忙去處理
由圖可知咱們應該修改session機制中的session的讀取和最終的寫入。
要修改session機制要藉助一個系統函數
session_set_save_handler():用來使用外部用戶定義的函數,來取代session系統自己的函數。
session_set_save_handler(開啓session機制函數,關閉session機制函數,讀取session數據函數,寫入session函數,銷燬session函數,後手過時session函數)。
所以咱們要準備六個函數。
代碼實現:
<?php //session入庫 //覺得修改session機制必須藉助session_set_save_handler()函數,該函數須要6個能夠調用的回調函數,所以須要建立6我的對應的函數 //1.開啓session機制 function sess_open() { //開啓資源 //鏈接數據庫 mysql_connect('localhost','root',''); mysql_query('set names utf8'); mysql_query('use session'); echo __FUNCTION__,'<br/>'; } //2.關閉session function sess_close() { //關閉資源 mysql_close(); echo __FUNCTION__,'<br/>'; } //3.讀取session function sess_read($sess_id) { //從數據庫讀取數據 //根據sess_id(由系統提供)獲取數據 //讀數據時要過濾掉過時的數據 $expire=time()-ini_get('session.gc_maxlifetime'); $sql="selsct * from session where sess_id='{$sess_id}' and sess_expire>='{$expire}'"; $res=mysql_query($sql); //獲得的是一個數組 if($sess=@mysql_fetch_assoc($res)) { //獲得一個序列化後的字符串 //要進行反序列化,read只負責讀取數據,不負責加工數據 return $sess['sess_info']; } echo __FUNCTION__,'<br/>'; } //4.寫入session function sess_write($sess_id,$sess_info) { //向數據庫中寫入數據 $time=time(); $sql="replace into session values('{$sess_id}','{$sess_info}','{$time}')"; mysql_query($sql); echo __FUNCTION__,'<br/>'; } //5.銷燬session function sess_destroy($sess_id) { $sql="delete from session where sess_id='{$sess_id}'"; return mysql_query($sql); echo __FUNCTION__,'<br/>'; } //6.回收session function sess_gc() { //從數據庫刪除過時的session數據 //判斷session是否過時,過時的刪除 $expire=ini_get('session.gc_maxlifetime'); //獲得最遲的時間,在$expire以前的都是過時的 $expire=time()-$expire; $sql="delete from session where sess_expire < '{expire}'"; return mysql_query($sql); echo __FUNCTION__,'<br/>'; } //使用session_set_save_handler()修改session機制 session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destroy','sess_gc'); //想要使用session,必需要用session_start()來開啓 session_start(); $_SESSION['name']='wangqixing'; $_SESSION['age']='23'; //session_destroy();