session mysql java_PHP自定义session处理方法,保存到MySQL数据库中
我們都知道,session是為了解決因特網(wǎng)的無狀態(tài)屬性而創(chuàng)造出來的。我們可以用session這種會話管理機制來構(gòu)建購物車、監(jiān)控站點網(wǎng)絡(luò)訪問,甚至還可以跟蹤某一個用戶具體是如何使用你的應(yīng)用的。PHP默認(rèn)的session處理行為已經(jīng)能應(yīng)付大部分的場景,但有時候我們還是希望能夠主動一點來控制session的處理方式,比如存儲到數(shù)據(jù)庫中而不是文件系統(tǒng)。下面我將以保存session到MySQL數(shù)據(jù)庫給大家講解如何自定義session處理方法。
解構(gòu)session存儲
在我們開始構(gòu)建自己的session處理及存儲方法之前,理解PHP默認(rèn)如何存儲session數(shù)據(jù)是很有幫助的。session數(shù)據(jù)被保存在服務(wù)器上一個很小的文件中,并關(guān)聯(lián)了一個唯一的ID,隨后被瀏覽器以cookie的形式保存在客戶端。如果cookie沒被起用,那么ID就會隨著URL被當(dāng)做參數(shù)進(jìn)行傳遞。無論是哪種方式,在隨后的請求中,PHP都是通過這個唯一的ID對session數(shù)據(jù)進(jìn)行讀取、更新或者刪除等操作。為了便于理解這是怎么一回事,我們可以先從session數(shù)據(jù)保存的位置開始分析。對于文件形式保存的session數(shù)據(jù),可以通過檢查php.ini中的session.save_path得知,也可以用session_save_path()函數(shù)進(jìn)行輸出,如:
echo session_save_path();
輸出結(jié)果就是session數(shù)據(jù)保存的位置。如果你想更改存儲位置,可以修改php.ini配置,或者執(zhí)行session_save_path()函數(shù),參數(shù)就是新的存儲路徑。
session_save_path("/path/to/session/data");
最佳實踐:如果你自定義了session存儲路徑,那么建議把路徑選擇在網(wǎng)站根目錄之外,這樣可以最大限度避免非法獲取session數(shù)據(jù)。當(dāng)然,你需要保證PHP程序能夠正常讀寫session文件。
現(xiàn)在我們已經(jīng)知道了session數(shù)據(jù)存儲在哪,那我們就很容易找到對應(yīng)當(dāng)前訪問的session文件。session文件的命名以“sess_”為前綴,加上唯一的ID。session_id()可以獲取唯一ID值(是32位的字符串)。文件內(nèi)容是以類似serialize()函數(shù)編碼的方式處理過的數(shù)據(jù)。
提醒:無論session是保存在默認(rèn)路徑,還是自定義路徑或數(shù)據(jù)庫中,內(nèi)容都是一樣的。我們能改變的是存儲位置,而不是存儲的內(nèi)容。
session的生命周期
所有的session從session_start()開始,session文件被打開,數(shù)據(jù)已數(shù)組的形勢保存在$_SESSION變量中。當(dāng)腳本執(zhí)行完成之后,數(shù)據(jù)又被重新保存到session文件中。所以,當(dāng)你設(shè)置了一個session值的時候,它并不是馬上就會進(jìn)行存儲的。但是,你可以通過執(zhí)行session_write_close()函數(shù)強制進(jìn)行session數(shù)據(jù)的保存。
session_set_save_handler() 函數(shù)提供了自定義session數(shù)據(jù)存儲的機制。它需要六個參數(shù),每個參數(shù)都是一個可回調(diào)的函數(shù),對應(yīng)了session生命周期的每個階段:
打開session文件open
關(guān)閉session文件close
讀取session數(shù)據(jù)read
寫入session數(shù)據(jù)write
銷毀session destroy
垃圾回收 gc
PHP5.4之后,可以只傳遞兩個參數(shù),第一個參數(shù)是實現(xiàn)了SessionHandlerInterface接口的對象,第二個參數(shù)控制是否將函數(shù) session_write_close() 注冊為 register_shutdown_function() 函數(shù)。
自定義session處理:存儲到MySQL數(shù)據(jù)庫
創(chuàng)建存儲表
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
Session類
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}'");
// 此處返回很重要,要么為空字符串,要么為實際數(shù)據(jù)。如果是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
return true;
}
}
重要:請自行更改數(shù)據(jù)庫操作方式。以上代碼只在我自己的環(huán)境中可運行。
起用新session處理方式
$handler = new Session();
session_set_save_handler($handler, true);
session_start();
總結(jié)
以上是生活随笔為你收集整理的session mysql java_PHP自定义session处理方法,保存到MySQL数据库中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: graphic头文件函数_graphic
- 下一篇: 极光实时监听怎么调用_源码分析 Sent