You are here: 首頁 PHP分享特區 [轉]PHP 的session 儲存於mysql 資料庫內

飛朵啦學習手札

本網站建議使用Firefox2.0以上,或是使用Goole瀏覽器來瀏覽,並使用1024x768解析度來觀看.

[轉]PHP 的session 儲存於mysql 資料庫內

E-mail 列印 PDF
PHP預設的SESSION的存放有以下幾點缺點.
隱患一:如果用戶端機器的cookie一旦因病毒而失效了,那麼session也就相當於沒有了。
隱患二:session在php中預設的是以檔的形式保存在一個暫存檔案夾裡面的,對於一個小型系統來說,這樣做完全可以,
可是對於一個大型而又被經常訪問的系統來說,就不是很好的辦法了。假設這個網站一天有1000個人訪問。一個月以後session的暫存檔案夾就會有30000個暫存檔案。想像一下電腦要從30000裡面找一條session_sid是一個多麼漫長的事情呀!
因此為了提高效率。
交易使用用資料庫保存session。具體方法如下:
1.更改php.ini檔。
由於php預設保存session的方式是files所以我們要改變它。即:找到“session.save_handler = files”將“files”改為“User”。
把session的模式改成使用者自訂的。
2.建立資料庫:
CREATE TABLE `db_session` (
`sesskey` char(32) NOT NULL,
`expiry` int(11) unsigned NOT NULL,
`value` text NOT NULL,
PRIMARY KEY (`sesskey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
[/code]
資料庫表明:db_session
列名:sesskey,expiry,value 其中:sesskey為主鍵。
Value裡面存放著session裡面的值。
3.建立session_mysql.php檔。這個檔是用來構造保存session的方法的。修改一下參數直接使用就可以了。
session_mysql.php
PHP代碼:
複製代碼 代碼如下:
<?php
$gb_DBname     = "db_myBBS"; //資料庫名稱
$gb_DBuser     = "root"; //資料庫使用者名稱
$gb_DBpass     = "23928484"; //資料庫密碼
$gb_DBHOSTname = "localhost"; //主機的名稱或是IP位址
$SESS_DBH      = "";
$SESS_LIFE     = get_cfg_var("session.gc_maxlifetime"); //得到session的最大有效期。
function sess_open($save_path, $session_name)
{
global $gb_DBHOSTname, $gb_DBname, $gb_DBuser, $gb_DBpass, $SESS_DBH;
if (!$SESS_DBH = mysql_pconnect($gb_DBHOSTname, $gb_DBuser, $gb_DBpass)) {
echo "<li>MySql Error:" . mysql_error() . "<li>";
die();
}
if (!mysql_select_db($gb_DBname, $SESS_DBH)) {
echo "<li>MySql Error:" . mysql_error() . "<li>";
die();
}
return true;
}
function sess_close()
{
return true;
}
function sess_read($key)
{
global $SESS_DBH, $SESS_LIFE;
$qry = "select value from db_session where sesskey = '$key' and expiry > " . time();
$qid = mysql_query($qry, $SESS_DBH);
if (list($value) = mysql_fetch_row($qid)) {
return $value;
}
return false;
}
function sess_write($key, $val)
{
global $SESS_DBH, $SESS_LIFE;
$expiry = time() + $SESS_LIFE;
$value  = $val;
$qry    = "insert into db_session values('$key',$expiry,'$value')";
$qid    = mysql_query($qry, $SESS_DBH);
if (!$qid) {
$qry = "update db_session set expiry=$expiry, value='$value' where sesskey='$key' and expiry >" . time();
$qid = mysql_query($qry, $SESS_DBH);
}
return $qid;
}
function sess_destroy($key)
{
global $SESS_DBH;
$qry = "delete from db_session where sesskey = '$key'";
$qid = mysql_query($qry, $SESS_DBH);
return $qid;
}
function sess_gc($maxlifetime)
{
global $SESS_DBH;
$qry = "delete from db_session where expiry < " . time();
$qid = mysql_query($qry, $SESS_DBH);
return mysql_affected_rows($SESS_DBH);
}
session_module_name();
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>

4.建立測試檔。
在使用之前必須引用剛剛建立的session_mysql.php檔。
session_test.php
PHP代碼:
複製代碼 代碼如下:
<?php
include("session_mysql.php");
session_start();
$_SESSION['abc']  = "A: I will be back!";
$_SESSION['meto'] = "B: Me too ";
$_SESSION['name'] = "louis ";
echo "<a href=\"get_session_test.php\">click me</a>";
?>

get_session_test.php
複製代碼 代碼如下:
<?php
include("session_mysql.php");
session_start();
echo $_SESSION['abc'];
echo "<br>";
echo $_SESSION['meto'];
echo "<br>";
echo $_SESSION['name'];
$_SESSION['wq'] = "12e";
echo "<br><a href=\"get_session_test2.php\">click again</a>";
?>

get_session_test2.php
複製代碼 代碼如下:
<?php
include("session_mysql.php");
session_start();
echo $_SESSION['abc'];
echo "<br>";
echo $_SESSION['meto'];
echo "<br>";
echo $_SESSION['name'];
echo "<br>";
echo $_SESSION['wq'];
//session_destroy();//用來銷毀所有session的函數。
?>
 
 

新增回應


驗證碼
更新