php基于session實現(xiàn)數(shù)據(jù)庫交互的類實例
更新時間:2015年08月03日 15:46:30 作者:不是JS
這篇文章主要介紹了php基于session實現(xiàn)數(shù)據(jù)庫交互的類,實例分析了php結合session操作數(shù)據(jù)庫的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
本文實例講述了php基于session實現(xiàn)數(shù)據(jù)庫交互的類。分享給大家供大家參考。具體如下:
<?php
/**
* session 數(shù)據(jù)庫存儲類
*/
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;//默認
private static $httponly = false;//默認
/**
* 獲取數(shù)據(jù)庫句柄 私有
*/
private static function open()
{
if (!self::$dbo)
{
self::$dbo = Db::factory();
}
return TRUE;
}
/**
* 設置
* */
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 清除 隨機觸發(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;
}
}
希望本文所述對大家的php程序設計有所幫助。
您可能感興趣的文章:
- 將PHP的session數(shù)據(jù)存儲到數(shù)據(jù)庫中的代碼實例
- php session 寫入數(shù)據(jù)庫
- php實現(xiàn)將Session寫入數(shù)據(jù)庫
- PHP將session信息存儲到數(shù)據(jù)庫的類實例
- php中使用session_set_save_handler()函數(shù)把session保存到MySQL數(shù)據(jù)庫實例
- PHP獨立Session數(shù)據(jù)庫存儲操作類分享
- php把session寫入數(shù)據(jù)庫示例
- Session保存到數(shù)據(jù)庫的php類分享
- PHP用mysql數(shù)據(jù)庫存儲session的代碼
- PHP封裝的數(shù)據(jù)庫保存session功能類
相關文章
PHP如何實現(xiàn)Unicode和Utf-8編碼相互轉換
本文介紹了通過PHP實現(xiàn)一個函數(shù)可以對字符串進行Unicode的編碼和解碼,需要的朋友可以參考下2015-07-07
php實現(xiàn)跨域提交form表單的方法【2種方法】
這篇文章主要介紹了php實現(xiàn)跨域提交form表單的方法,結合實例形式分析了curl及ajax兩種方法進行跨域提交的操作技巧,需要的朋友可以參考下2016-10-10
php 數(shù)組動態(tài)添加實現(xiàn)代碼(最土團購系統(tǒng)的價格排序)
最近在實現(xiàn)最土團購系統(tǒng)的價格排序功能,需要對$oc數(shù)組進行擴展,經過測試用下面的方法即可。2011-12-12
PHP實現(xiàn)圖片防盜鏈破解操作示例【解決圖片防盜鏈問題/反向代理】
這篇文章主要介紹了PHP實現(xiàn)圖片防盜鏈破解操作,結合實例形式分析了PHP解決圖片防盜鏈問題的相關操作技巧,需要的朋友可以參考下2020-05-05

