php基于session實(shí)現(xiàn)數(shù)據(jù)庫交互的類實(shí)例
本文實(shí)例講述了php基于session實(shí)現(xiàn)數(shù)據(jù)庫交互的類。分享給大家供大家參考。具體如下:
<?php
/**
* session 數(shù)據(jù)庫存儲(chǔ)類
*/
class Session {
private static $session_id = 0;
private static $session_data = array();
private static $is_update = FALSE;
private static $is_del = FALSE;
private static $is_gc = FALSE;
private static $dbo = NULL; //數(shù)據(jù)庫連接句柄
private static $gc_max_time = 1440;
private static $table = 'sessions';
private static $pre_key = 'weige';//session 密鑰
//捆綁使用哈
private static $gc_rate_de = 100;//代表分母
private static $gc_rate_co = 20;//代表分子
private static $path = '/';//保存路徑
private static $domain = null; //域
private static $secure = false;//默認(rèn)
private static $httponly = false;//默認(rèn)
/**
* 獲取數(shù)據(jù)庫句柄 私有
*/
private static function open()
{
if (!self::$dbo)
{
self::$dbo = Db::factory();
}
return TRUE;
}
/**
* 設(shè)置
* */
public static function set($key, $val=NULL)
{
self::open();
$data = self::read();
if ($data === FALSE)
{
$data = array();
}
if (!$val && is_array($key))
{
$data = $key;
}
else if ($val && is_string($key))
{
$data[$key] = $val;
}
self::write($data);
self::close();
}
/**
*獲取值
*
*/
public static function get($key=NULL) {
self::open();
self::$session_data = self::read();
$ret = '';
if (!$key) {
$ret = self::$session_data;
} else if(is_array(self::$session_data) && isset(self::$session_data[$key])) {
$ret = self::$session_data[$key];
}
self::update();
self::close();
return $ret;
}
/**
* 刪除或者重置
* */
public static function del($key)
{
if (!self::$is_del)
{
self::open();
$val = self::read();
if (isset($val[$key]))
{
unset($val[$key]);
}
$session_id = self::$session_id;
$session_data = serialize($val);
$session_expire = TIME + self::get_gc_maxtime();
self::$dbo->query("update ".self::$table." set value='$session_data', expiry='$session_expire' where session_id='$session_id'");
self::close();
}
self::$is_del = TRUE;
}
/**
* 銷毀
*
* */
public static function destroy()
{
$session_id = self::get_session_id();
$_COOKIE['WBSID'] = '';
self::open();
self::$dbo->query("delete from ".self::$table." where session_id='$session_id'");
self::close();
}
/**
* 讀取 私有
* */
private static function read()
{
$session_id = self::$session_id;
if (!$session_id) {
$session_id = self::get_session_id();
}
if (!$session_id) return array();
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? md5($_SERVER['HTTP_USER_AGENT']) : '';
$client_ip = Fun::getIp();
$session_expire = TIME - self::get_gc_maxtime();
$rs = self::$dbo->fetchRow("select session_id, value, agent, ip from ".self::$table."
where session_id='$session_id' and expiry>'$session_expire'");
if (!$rs || $rs['agent'] != $user_agent || $rs['ip'] != $client_ip)
{
return FALSE;
}
self::$session_id = $rs['session_id'];
return unserialize($rs['value']);
}
/**
* session 寫入 私有
* */
private static function write(array $session_data)
{
$session_id = self::$session_id;
if (!$session_id)
{
$session_id = self::get_session_id();
}
$session_expire = TIME + self::get_gc_maxtime();
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? md5($_SERVER['HTTP_USER_AGENT']) : '';
$client_ip = Fun::getIp();
$session_data = serialize($session_data);
if (self::$session_id && self::$session_id === $session_id)
{
self::$dbo->query("update ".self::$table." set value='$session_data', expiry='$session_expire', agent='$user_agent', ip='$client_ip' where session_id='$session_id'");
}
else
{
self::$session_id = $session_id = self::create_session_id();
self::$dbo->query("insert into ".self::$table."(session_id, value, expiry, agent, ip)
values('$session_id', '$session_data', '$session_expire', '$user_agent', '$client_ip')");
}
return true;
}
/**
* session 更新 私有
* */
private static function update()
{
if (!self::$is_update)
{
$session_id = self::$session_id;
$session_expire = TIME + self::get_gc_maxtime();
self::$dbo->query("update ".self::$table." set expiry='$session_expire' where session_id='$session_id'");
}
self::$is_update = TRUE;
}
private static function close()
{
if (!self::$is_gc && mt_rand(1, self::$gc_rate_de)%self::$gc_rate_co == 0)
{
self::gc();
}
self::$is_gc = TRUE;
}
/**
* 過期session 清除 隨機(jī)觸發(fā)
* */
private static function gc()
{
$session_expire = TIME - self::get_gc_maxtime();
self::$dbo->query("delete from ".self::$table." where expiry<'$session_expire'");
}
private static function get_session_id()
{
if (isset($_COOKIE['WBSID']) && strlen($_COOKIE['WBSID'])==32)
{
$sid = $_COOKIE['WBSID'];
setcookie('WBSID', $sid, TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
return $sid;
}
return null;
}
private static function create_session_id()
{
$sid = self::get_session_id();
if (!$sid)
{
$sid = Fun::getIp() . TIME . microtime(TRUE) . mt_rand(mt_rand(0, 100), mt_rand(100000, 90000000));
$sid = md5(self::$pre_key . $sid);
setcookie('WBSID', substr($sid, 0, 32), TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
}
return $sid;
}
public static function get_gc_maxtime()
{
return self::$gc_max_time;
}
}
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
- 將PHP的session數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫中的代碼實(shí)例
- php session 寫入數(shù)據(jù)庫
- php實(shí)現(xiàn)將Session寫入數(shù)據(jù)庫
- PHP將session信息存儲(chǔ)到數(shù)據(jù)庫的類實(shí)例
- php中使用session_set_save_handler()函數(shù)把session保存到MySQL數(shù)據(jù)庫實(shí)例
- PHP獨(dú)立Session數(shù)據(jù)庫存儲(chǔ)操作類分享
- php把session寫入數(shù)據(jù)庫示例
- Session保存到數(shù)據(jù)庫的php類分享
- PHP用mysql數(shù)據(jù)庫存儲(chǔ)session的代碼
- PHP封裝的數(shù)據(jù)庫保存session功能類
相關(guān)文章
php計(jì)算數(shù)組不為空元素個(gè)數(shù)的方法
本文為大家介紹下php計(jì)算數(shù)組不為空元素個(gè)數(shù)的方法,需要的朋友可以參考下2014-01-01
PHP Token(令牌)設(shè)計(jì) 設(shè)計(jì)目標(biāo): 避免重復(fù)提交數(shù)據(jù). 檢查來路,是否是外部提交 匹配要執(zhí)行的動(dòng)作(如果有多個(gè)邏輯在同一個(gè)頁面實(shí)現(xiàn),比如新增,刪除,修改放到一個(gè)PHP文件里操作) 這里所說的token是在頁面顯示的時(shí)候,寫到FORM的一個(gè)隱藏表單項(xiàng)(type=hidden). token不可明文,如果是明文,那就太危險(xiǎn)了,所以要采用一定的加密方式.密文要可逆.俺算法很白癡,所以采用了網(wǎng)上一個(gè)現(xiàn)成的方法.2008-03-03
PHP如何實(shí)現(xiàn)Unicode和Utf-8編碼相互轉(zhuǎn)換
本文介紹了通過PHP實(shí)現(xiàn)一個(gè)函數(shù)可以對(duì)字符串進(jìn)行Unicode的編碼和解碼,需要的朋友可以參考下2015-07-07
golang 調(diào)用 php7詳解及實(shí)例
這篇文章主要介紹了golang 調(diào)用 php7詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-01-01
基于php實(shí)現(xiàn)長連接的方法與注意事項(xiàng)的問題
本篇文章是對(duì)在php中實(shí)現(xiàn)長連接的方法與注意事項(xiàng)的問題進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05
php實(shí)現(xiàn)跨域提交form表單的方法【2種方法】
這篇文章主要介紹了php實(shí)現(xiàn)跨域提交form表單的方法,結(jié)合實(shí)例形式分析了curl及ajax兩種方法進(jìn)行跨域提交的操作技巧,需要的朋友可以參考下2016-10-10
php 數(shù)組動(dòng)態(tài)添加實(shí)現(xiàn)代碼(最土團(tuán)購系統(tǒng)的價(jià)格排序)
最近在實(shí)現(xiàn)最土團(tuán)購系統(tǒng)的價(jià)格排序功能,需要對(duì)$oc數(shù)組進(jìn)行擴(kuò)展,經(jīng)過測試用下面的方法即可。2011-12-12
PHP實(shí)現(xiàn)圖片防盜鏈破解操作示例【解決圖片防盜鏈問題/反向代理】
這篇文章主要介紹了PHP實(shí)現(xiàn)圖片防盜鏈破解操作,結(jié)合實(shí)例形式分析了PHP解決圖片防盜鏈問題的相關(guān)操作技巧,需要的朋友可以參考下2020-05-05

