php重寫session的存儲機制


 

重寫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字段的內容。如果沒有讀到,則返回空字符串即可,表示沒有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: 表示用戶自定義!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM