麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > PHP > 正文

PHP中如何將session存入數據庫并使用(附代碼)

2020-03-22 20:08:27
字體:
來源:轉載
供稿:網友
這篇文章給大家介紹的內容是關于PHP中如何將session存入數據庫并使用(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

實例說明:

將SESSION數據變量存儲于服務器是端是一種較安全的做法,但是設想一下,像校內網這樣的日訪問量過億,擁有用戶幾千萬的大型網站,如果將所有用戶SESSION數據全部存儲于服務器端,將消耗巨大的服務器資源。所以程序員在制作大型網站時將SESSION存儲于服務器端雖然安全,但卻不是最好的選擇。如果將SESSION數據存儲于數據庫中,那么就可以減輕服務器的壓力同時數據也是比較安全的。

設計過程

首先在Mysql數據庫創建存儲SESSION的表:

表名為t_session

表結構為

說明:session_key:是用來存會話ID的

session_data:是用來存經序列化后的$_SESSION[]里的值;

session_time:是用來存時間戳的,這個時間戳指的是當前session在創建時的 time()+session的有效期。需要注意的是這 里的session_time的類型是int,這樣可以在操作數據庫時,進行大小比較!

那么什么是序列化呢?

序列化 (Serialization)就是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。

比如說

$_SESSION[“user”]=”張三”$_SESSION[“pwd”]=”zhangsan”

序列話后成為一個字符串

user|s:6: 張三 pwd|s:8: zhangsan 

其中s表示類型為string,數字表示字符串長度,這樣就可以對這個字符串操作了。

接下來就是正文部分了

session.save_handler 定義存儲和獲取與會話關聯的數據的處理器的名字。默認為 files。如果設定為files(session.save_handler = files),則采用的是php內置機制,如果想自定義存儲方式(比如存儲到數據庫中),則使用session_set_save_handler()進行自定義設置,我們這里說的則是第二種。

所以我們得修改php.ini文件里session_set_save_handler的值,將其修改為user,如圖:

bool session_set_save_handler ( callable open , callable $close , callable read , callable write , callable destroy , callable gc [, callable $create_sid [, callable validate_sid [, callable update_timestamp ]]] )

如果不修改,那你在使用session的時候可以不用理他,但當你修改 了,你不得不面對他。這是一個很特殊的函數,因為一般的函數的參數都是變量,但是該函數的參數為6個函數(后面的三個參數為可選參數,可忽略)不用怕,一個一個來:

第一個參數: open(save_path,session_name),這里面的兩個參數是php自動傳遞的。save_path 在session.save_handler = files的情況下它就是session.save_path,session_name則是服務器用來識別客戶端的會話ID,但是如果用戶自定的話,這個兩個參數都用不上,只在其中連接數據庫,open 回調函數類似于類的html' target='_blank'>構造函數,在會話打開的時候會被調用。 這是自動開始會話或者通過調用 session_start() 手動開始會話之后第一個被調用的回調函數。 此回調函數操作成功返回 TRUE,反之返回 FALSE。

第二個參數: close(),這個函數不需要參數,用來關閉數據庫。close 回調函數類似于類的析構函數。 在 write 回調函數調用之后調用。 當調用 session_write_close() 函數之后,也會調用 close 回調函數。 此回調函數操作成功返回 TRUE,反之返回 FALSE。

第三個參數: read($key),這里面的參數是會話ID,php自動傳遞的,傳遞的前提是有會話ID,若無,則這個參數返回空字符串。注意,若數據庫中無對應的數據一定要返回空字符串,否則報錯!如果會話中有數據,read 回調函數必須返回將會話數據編碼(序列化)后的字符串(在此處就是從表t_session里取出的session_data)。在自動開始會話或者通過調用 session_start()函數手動開始會話之后,PHP 內部調用 read 回調函數來獲取會話數據。 在調用 read 之前,PHP 會調用 open 回調函數。read 回調返回的序列化之后的字符串格式必須與 write 回調函數保存數據 時的格式完全一致。 PHP 會自動反序列化返回的字符串并填充 $_SESSION 超級全局變量

第四個參數: write($key,$data), 這兩個參數也是php自動傳遞給這個函數的,$key對應會話ID,$data對應當前(因為write函數一般是在腳本執行結束后才被調用的)腳本被序列化處理器處理的session變量(如上文提到的$_SESSION[“user”]=”張三”$_SESSION[“pwd”]=”zhangsan”),序列化會話數據的過程由 PHP 根據 session.serialize_handler 設定值來完成。序列化后的數據將和會話 ID 關聯在一起進行保存。 當調用 read 回調函數獲取數據時,所返回的數據必須要和 傳入 write 回調函數的數據完全保持一致。PHP 會在腳本執行完畢或調用 session_write_close() 函數之后調用此回調 函數。注意,在調用完此回調函數之后,PHP 內部會調用 close 回調函數。

NOTE:PHP 會在輸出流寫入完畢并且關閉之后 才調用 write 回調函數, 所以在 write 回調函數中的調試信息不會輸出到瀏覽器中。 如果需要在 write 回調函數中使用調試輸出, 建議將調試輸出寫入到文件。

第五個參數: destroy($key),當調用 session_destroy() 函數, 或者調用 session_regenerate_id() 函數并且設置 destroy 參數為 TRUE 時, 會調用此回調函數。用來注銷session對應的SESSION鍵值,此回調函數操作成功返回 TRUE,反之返回 FALSE。它就是人們常常在點擊注銷登錄的時候用到的函數。后面會有這個小細節。

第六個參數: gc(expire_time),這個函數的參數在默認機制下就是session.gc_maxlifetime設置的session有效時間。但是,user機制下session的過期時間在就是表里session_time,所以這里不需要傳遞參數的。為了清理會話中的舊數據,PHP 會不時的調用垃圾收集回調函數。 調用周期由 session.gc_probability 和 session.gc_pisor 參數控制。此回調函數操作成功返回 TRUE,反之返回 FALSE。

至此六個函數已經介紹完了,但是其中有許多需要說明的:

1、在open函數中本來是要傳遞save__path,目的是用來在這個路徑下找到與session_name相對應的文件,然后通過read()函數來讀取其中的數據,然后通過反序列化處理器將取到的字符串反序列化,在通過php自動填充各個$_session超全局變量。或者write函數來將序列化的數據存入這個路徑下的文件。那么這里面的路徑在非默認機制下難道就不需要嗎,答案是肯定的*_*。當在非默認機制下,調試輸出session_save_path,其結果為空值;而且如果未設置存儲的路徑,那被填充的$_session變量也只能在當前頁面使用,而不能在別的頁面使用,可以這樣測試:在另一個頁面利用session_start()函數打開會話,然后輸出session_id和var_dump($_session),得到的是上一次瀏覽時服務器給客戶端的session_id,但是$_session輸出的是空數組(當然我這里只是大概的說一下我在驗證時的過程)。其實我想說的就是我們在自定義會話存儲機制的時候,是不需要自定義路徑的,不然為什么還要存入數據庫呢?

那么怎么在其他頁面也能讀取到$_session[]里面的值呢?

引入這個函數,即將六個 回調函數和session_set_save_handler放入一個文件里,然后在session_start()前用include()引入!

2、那他們的執行順序是怎樣呢?有點暈吧,來總結一下:首先session_start()函數打開session操作句柄,然后read函數讀取數據,當腳本執行結束的時候執行write函數然后是close函數若有session_destroy()則執行完。

3、上面我提到過PHP 會在輸出流寫入完畢并且關閉之后才調用 write 回調函數,這個可把我玩壞啦,小編在上面可繞了不久呀,不然我也不會在write函數里調試那么久了!不過我也因此了解了register_shutdown_function這個函數,下面附上這個函數的特點吧:register_shutdown_function()是指在執行完所有PHP語句后再調用函數,不要理解成客戶端關閉流瀏覽器頁面時調用函數。

可以這樣理解調用條件:
1、當頁面被用戶強制停止時
2、當程序代碼運行超時時
3、當PHP代碼執行完成時,代碼執行存在異常和錯誤、警告

好了以上該說的都說完了,附上代碼吧:

index.php用戶登錄界面

 ?php
session_destroy();//這里就是上文提到的 小細節了,當有session_destroy的時候,它是先于read回調函數執行的
if(isset($_SESSION[ user ])){//判斷此值是否有定義,若有定義則說明 存入的session還未到期,則直接轉到主內容
$_SESSION[ pwd ]=$_POST[ pwd //這里自定義的會話管理機制將會調用回調函數write,將已由序列化處理器處理好的(由$_session[]變量形成)字符串寫入數據庫
$sql= select session_data from t_session where session_key= $key and session_time $time
$over_time=time()+60;//注意time()為時間戳,在mysql中的數據類型不可用用date,datetime,timestamp來存儲
//若$result為false,即結果 為空,說明數據庫中未存有相應的session_id,那么就插入,如果不為空,那即使還有未過期的session_id,這是應更新
$sql= insert into t_session(session_key,session_data,session_time ) values( $key , $data ,$over_time) //字符串的時候要加單引號,數字的時候是不用加的
$sql= update t_session set session_key= $key ,session_data= $data ,session_time=$over_time where session_key= $key
function overdue($expire_time){//這個參數是自動傳進去的,就是session.gc_maxlifetime最大有效時間,例如1440s;
獨孤九賤(5)_ThinkPHP5視頻教程

ThinkPHP是國內最流行的中文PHP開發框架,也是您Web項目的最佳選擇。《VeVb.com獨孤九賤(5)-ThinkPHP5視頻教程》課程以ThinkPHP5最新版本為例,從最基本的框架常識開始,將...

Peter-Zhu 2017-05-16 12:03:57


獨孤九賤(4)_PHP視頻教程

江湖傳言:PHP是世界上最好的編程語言。真的是這樣嗎?這個梗究竟是從哪來的?學會本課程,你就會明白了。PHP 出品的PHP入門系統教學視頻,完全從初學者的角度出發,絕不玩虛的,一切以實用、有用...

Peter-Zhu 2017-03-20 22:47:17


獨孤九賤(1)_HTML5視頻教程

《VeVb.com原創html5視頻教程》課程特色:php 原創幽默段子系列課程,以惡搞,段子為主題風格的php視頻教程!輕松的教學風格,簡短的教學模式,讓同學們在不知不覺中,學會了HTML知識。...

Peter-Zhu 2017-03-13 10:15:11


ThinkPHP5實戰之[教學管理系統]

本套教程,以一個真實的學校教學管理系統為案例,手把手教會您如何在一張白紙上,從零開始,一步一步的用ThinkPHP5框架快速開發出一個商業項目。

Peter-Zhu 2017-07-24 16:48:56


PHP入門視頻教程之一周學會PHP

所有計算機語言的學習都要從基礎開始,《PHP入門視頻教程之一周學會PHP》不僅是PHP的基礎部分更主要的是PHP語言的核心技術,是學習PHP必須掌握的內容,任何PHP項目的實現都離不開這部分的內容,通...

PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: www.成人在线视频 | 国产一级毛片视频在线! | 97中文 | 久久国产亚洲精品 | 欧美国产一区二区三区激情无套 | 久久精品性视频 | 久久av免费观看 | 国产精品99久久免费观看 | 91精品国产综合久久久动漫日韩 | 91社区电影 | 爱性久久久久久久 | 久久成人免费观看 | 91久久综合| 欧美日韩成人一区二区 | 亚洲第一页在线观看 | 免费小毛片 | 7777视频 | 毛片免费在线播放 | 免费99热在线观看 | 国产精品一品二区三区四区18 | 黄色一级毛片免费看 | 在线播放免费播放av片 | 免费国产一级淫片 | 午夜精品在线视频 | 91在线播放国产 | 国产羞羞视频在线免费观看 | 欧美成人免费 | 午夜精品久久久久久中宇 | 91成人影库 | 亚洲成人国产综合 | 国产一区二区影视 | 亚洲欧美在线视频免费 | 国产精品久久久久久影院8一贰佰 | 国产精品999在线观看 | 精品中文字幕在线观看 | 久久久久久久久久久久久久久久久久 | 久久久成人精品视频 | 久久久国产电影 | avav在线播放 | 免费在线观看成年人视频 | 最新在线黄色网址 |