session高級(session入庫)

咱們知道,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();
相關文章
相關標籤/搜索