這篇文章主要介紹了關於php如何重寫session的儲存機制,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
Session資料區
預設以 檔案的形式儲存與伺服器作業系統臨時目錄中!
當 session資料區過多時,檔案形式的儲存,操作速度變慢。磁碟的讀寫(IO,input/output)開銷是很大的。
實際項目中,都會採用其他的方式更快地儲存session資料。典型的辦法:資料庫,記憶體。
以 資料庫儲存為例,講解:session資料入庫!
重寫 與 session資料區直接的相關操作即可:
最基本的只有2個:讀,寫!
一:定義2個可以完成讀和寫的函數。
二:告知session機制,在需要讀寫時,使用使用者自訂的讀寫函數完成。
定義2(其實共6個需要的相關函數)個可以完成讀和寫的函數
告知session機制,在需要讀寫時,使用使用者自訂的讀寫函數完成
Session_set_save_handler(
開始函數,結束函數,讀函數,寫函數,刪除函數,GC函數
);
用來將使用者自訂的函數,設定成session儲存相關的函數。
以上的文法,僅僅是設定告知,不是調用以上6個函數,這六個函數,在session機制運行到某個時間點時,才會被調用!例如,咋開啟session時,才需要調用sessRead()
常規使用session
開啟session機制
操作$_SESSION
建立session表
該session中,每條記錄,就是一個session資料區,相當於原來的一個session檔案。
表結構:
讀操作:sessRead()
誰調用,誰傳參!
在PHP的session機制調用該函數時,會將當前的session-ID作為參數傳遞到函數中:
因此,需要定一個形參,接受傳遞的session-ID 參數:
需要返回,讀取到的session資料字串。就是sess_content欄位的內容。如果沒有讀到,則返回Null 字元串即可,表示沒有session資料。
寫操作:sessWrite()
當PHPsession機制調用該函數執行寫操作時,會將 當前session-ID和 需要寫入的內容(序列化好的)傳遞到函數!
需要2個形參來接收:
測試:
刪除操作:sessDelete()
銷毀session時。
執行了PHP函數:
Session_destroy();
可以銷毀session,刪除對應的session資料區,同時關閉session機制!
由於需要刪除session資料區,需要增加用於刪除的方法:
PHP的session機制,在調用sessDelete時,會傳遞 當前session-ID作為參數:
需要定義形參來接收:
記憶體回收操作:sessGC()
垃圾:伺服器上過時的session資料區。、
垃圾如何判定?
如果一個session資料區已經超過多久沒有使用(最後一次寫操作)了,就是被視為垃圾資料。
該時間臨界點:預設1440s。可以被配置:
配合最後寫入時間,就可以斷定是否為垃圾
需要增加欄位,記錄最後寫入時間。
寫入時,更新該欄位:
sessWrite();
判斷條件:到期
Last_write < 目前時間-1440
如何刪除?
在 session_start()過程中,開啟session機制過程中:有幾率地執行 記憶體回收操作。一旦執行,就會刪除所有的到期的垃圾資料區。
預設的機率為1/1000。
可以設定該幾率:
可能性:
基數(除數):
調整幾率測試:
建議在指令碼周期調整,使用函數ini_set(),在開啟session機制前完成:
實現 sessGC()
PHP的session機制將 最大有效期間作為參數,傳遞過來!
開始操作sessBegin():
初始化工作
可保證在第一個執行。將初始代碼,在sessBegin完成:
例如初始化資料庫連接:
結尾操作sessEnd():
收尾性工作
Return true;
文法細節
先設定在開啟session機制
Session_set_save_handler()先於session_start()被調用。
不要自動開啟session!php.ini: session.auto_start = 0
PHP配置項:session.save_handler
PHP所使用的儲存機制:
最後建議,將以上配置改為 user: 表示使用者自訂!
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!