您好,登錄后才能下訂單哦!
本篇內容介紹了“PHP自定義session處理方法保存到MySQL數據庫中”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在我們開始構建自己的session處理及存儲方法之前,理解PHP默認如何存儲session數據是很有幫助的。session數據被保存在服務器上一個很小的文件中,并關聯了一個唯一的ID,隨后被瀏覽器以cookie的形式保存在客戶端。如果cookie沒被起用,那么ID就會隨著URL被當做參數進行傳遞。無論是哪種方式,在隨后的請求中,PHP都是通過這個唯一的ID對session數據進行讀取、更新或者刪除等操作。為了便于理解這是怎么一回事,我們可以先從session數據保存的位置開始分析。對于文件形式保存的session數據,可以通過檢查php.ini
中的session.save_path
得知,也可以用session_save_path()
函數進行輸出,如:
<?php echo session_save_path();
輸出結果就是session數據保存的位置。如果你想更改存儲位置,可以修改php.ini
配置,或者執行session_save_path()
函數,參數就是新的存儲路徑。
session_save_path("/path/to/session/data");
最佳實踐:如果你自定義了session存儲路徑,那么建議把路徑選擇在網站根目錄之外,這樣可以最大限度避免非法獲取session數據。當然,你需要保證PHP程序能夠正常讀寫session文件。
現在我們已經知道了session數據存儲在哪,那我們就很容易找到對應當前訪問的session文件。session文件的命名以“sess_”為前綴,加上唯一的ID。session_id()
可以獲取唯一ID值(是32位的字符串)。文件內容是以類似serialize()
函數編碼的方式處理過的數據。
提醒:無論session是保存在默認路徑,還是自定義路徑或數據庫中,內容都是一樣的。我們能改變的是存儲位置,而不是存儲的內容。
所有的session從session_start()
開始,session文件被打開,數據已數組的形勢保存在$_SESSION
變量中。當腳本執行完成之后,數據又被重新保存到session文件中。所以,當你設置了一個session值的時候,它并不是馬上就會進行存儲的。但是,你可以通過執行session_write_close()
函數強制進行session數據的保存。
session_set_save_handler()
函數提供了自定義session數據存儲的機制。它需要六個參數,每個參數都是一個可回調的函數,對應了session生命周期的每個階段:
打開session文件open
關閉session文件close
讀取session數據read
寫入session數據write
銷毀session destroy
垃圾回收 gc
PHP5.4之后,可以只傳遞兩個參數,第一個參數是實現了
SessionHandlerInterface
接口的對象,第二個參數控制是否將函數session_write_close()
注冊為register_shutdown_function()
函數。
CREATE TABLE `hb_session` ( `id` char(32) NOT NULL, `data` text NOT NULL, `access` int(11) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
namespace core\basic; use core\database\DB; class Session implements \SessionHandlerInterface { public function open($save_path, $session_name) { return true; } public function close() { return true; } public function read($session_id) { $data = DB::fetch_first("select data from `" . DB::table('session') . "` where id='{$session_id}'"); // 此處返回很重要,要么為空字符串,要么為實際數據。如果是NULL,則session保存會失敗 return empty($data['data']) ? '' : $data['data']; } public function write($session_id, $data) { $now = time(); $session = DB::fetch_first("select data from `" . DB::table('session') . "` where id='{$session_id}'"); if (count($session) > 0) { DB::update("session", array( 'data' => $data, 'access' => $now ), "id='{$session_id}'"); } else { DB::insert("session", array( 'id' => $session_id, 'data' => $data, 'access' => $now )); } DB::affected_rows() ? true : false; } public function destroy($session_id) { DB::delete("session", "id='{$session_id}'"); return true; } public function gc($lifetime) { $subtime = time() - $lifetime; DB::delete("session", "access<{$subtime}"); return true; } }
重要:請自行更改數據庫操作方式。以上代碼只在我自己的環境中可運行。
$handler = new Session(); session_set_save_handler($handler, true); session_start();
“PHP自定義session處理方法保存到MySQL數據庫中”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。