在默認情況下,php的會話數據保存在服務器的臨時目錄中,文件名爲sessionid。
將會話信息保存到數據庫有3個原因:(1)在共享主機服務器上,所有web站點都使用同一個臨時目錄,這意味着數十個程序都在同一個位置進行文件讀取的操作,我們很容易就可以編寫一個腳本從這個目錄裏讀取所有的數據。(2)如果站點運行在多個服務器上,同一個用戶在一個會話過程中可能會對不同的服務器上的多個頁面產生請求,而會話數據如果保存在某臺服務器上的文件裏,就不能被其他服務器上的頁面所使用;(3)更方便檢索站點回話的信息,可以查詢活動回話的數量,還可以進行備份。
第一步:創建session表。字段:會話id,會話數據,最後一次訪問時間。
第二步:定義會話函數。會話包含的函數應該有:啓動會話,關閉會話,讀取會話數據,寫入會話數據,銷燬會話數據,舊會話數據被剔除(垃圾數據回收)
<?php
class SESSION
{
private $table="session" ;#表名
private $id= "id"; #表裏存放會話的ID號欄名稱
private $col_name = "data"; #表裏存放會話的數據欄名稱
private $time = "time"; #表裏存放會話的時間欄名稱
function__construct($table,$id,$col_name,$time)
{
$this->table =$table ? $table : $this->table;
$this->id = $id? $id : $this->id ;
$this->col_name= $col_name ? $col_name : $this->col_name ;
$this->time =$time ? $time : $this->time;
}
#打開會話
function open_session()
{
global $DB ;
$res =$DB->db_connect();
return $res ? true : false;
}
#關閉會話
function close_session()
{
global $DB ;
return $DB->db_close() ;
}
#讀取會話
function read_session($id)
{
global $DB ;
if (!$id) return "";
$sql =$DB->db_select($this->table,array("{$this->col_name}"),array("{$this->id}"=>$id));
$data =$DB->db_fetch_array($sql) ;
if($DB->db_num_rows($sql)==1)
{
return$data[0][$this->col_name];
}else {
return"";
}
}
#寫入數據函數
function write_session($id,$data)
{
global $DB ;
$sessArr =array("id"=>$id,"{$this->col_name}"=>$data);
return$DB->db_replace($this->table,$sessArr);
}
#銷燬會話函數
function destroy($id)
{
global $DB ;
$DB->db_delete($this->table,array("{$this->id}"=>$id));
$_SESSION[]=array();
returnmysql_affected_rows($DB->db_connect);
}
#會話垃圾收集函數
function clean_session($expire)
{
global $DB ;
$sql = "delete from`{$this->table}` whereDATE_ADD({$this->time}, INTERVAL (int){$expire}SECOND ) < NOW()";
$DB->db_query($sql);
returnmysql_affected_rows($DB->db_connect());
}
#會話調用函數
function start_session()
{
session_set_save_handler('open_session','close_session','read_session','write_session','destroy_session','clear_session');
session_start();
}
}