使用数据库保存session的方法
时间:2005-10-24 来源:erwolf
使用数据库保存session的方法
php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files 改为 user。
使用数据库保存session的方法
php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files 改为 user。
数据表结构:[session_tbl]
CREATE TABLE session_tbl (
sesskey char(32) not null,
expiry int(11) unsigned not null,
value text not null,
PRIMARY KEY (sesskey)
);
程序代码:[session_inc.php]
[color="#0000bb"]$SESS_DBHOST [color="#007700"]= [color="#dd0000"]"yourhost"[color="#007700"]; [color="#ff8000"]/* database server hostname */
[color="#0000bb"]$SESS_DBNAME [color="#007700"]= [color="#dd0000"]"yourdb"[color="#007700"]; [color="#ff8000"]/* database name */
[color="#0000bb"]$SESS_DBUSER [color="#007700"]= [color="#dd0000"]"youruser"[color="#007700"]; [color="#ff8000"]/* database user */
[color="#0000bb"]$SESS_DBPASS [color="#007700"]= [color="#dd0000"]"yourpassword"[color="#007700"]; [color="#ff8000"]/* database password */
[color="#0000bb"]$SESS_DBH [color="#007700"]= [color="#dd0000"]""[color="#007700"];
[color="#0000bb"]$SESS_LIFE [color="#007700"]= [color="#0000bb"]get_cfg_var[color="#007700"]([color="#dd0000"]"session.gc_maxlifetime"[color="#007700"]);
function [color="#0000bb"]sess_open[color="#007700"]([color="#0000bb"]$save_path[color="#007700"], [color="#0000bb"]$session_name[color="#007700"]) {
global [color="#0000bb"]$SESS_DBHOST[color="#007700"], [color="#0000bb"]$SESS_DBNAME[color="#007700"], [color="#0000bb"]$SESS_DBUSER[color="#007700"], [color="#0000bb"]$SESS_DBPASS[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"];
if (! [color="#0000bb"]$SESS_DBH [color="#007700"]= [color="#0000bb"]mysql_pconnect[color="#007700"]([color="#0000bb"]$SESS_DBHOST[color="#007700"], [color="#0000bb"]$SESS_DBUSER[color="#007700"], [color="#0000bb"]$SESS_DBPASS[color="#007700"])) {
echo [color="#dd0000"]"Can't connect to $SESS_DBHOST as $SESS_DBUSER"
php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files 改为 user。
使用数据库保存session的方法
php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files 改为 user。
数据表结构:[session_tbl]
CREATE TABLE session_tbl (
sesskey char(32) not null,
expiry int(11) unsigned not null,
value text not null,
PRIMARY KEY (sesskey)
);
程序代码:[session_inc.php]
[color="#0000bb"]$SESS_DBHOST [color="#007700"]= [color="#dd0000"]"yourhost"[color="#007700"]; [color="#ff8000"]/* database server hostname */
[color="#0000bb"]$SESS_DBNAME [color="#007700"]= [color="#dd0000"]"yourdb"[color="#007700"]; [color="#ff8000"]/* database name */
[color="#0000bb"]$SESS_DBUSER [color="#007700"]= [color="#dd0000"]"youruser"[color="#007700"]; [color="#ff8000"]/* database user */
[color="#0000bb"]$SESS_DBPASS [color="#007700"]= [color="#dd0000"]"yourpassword"[color="#007700"]; [color="#ff8000"]/* database password */
[color="#0000bb"]$SESS_DBH [color="#007700"]= [color="#dd0000"]""[color="#007700"];
[color="#0000bb"]$SESS_LIFE [color="#007700"]= [color="#0000bb"]get_cfg_var[color="#007700"]([color="#dd0000"]"session.gc_maxlifetime"[color="#007700"]);
function [color="#0000bb"]sess_open[color="#007700"]([color="#0000bb"]$save_path[color="#007700"], [color="#0000bb"]$session_name[color="#007700"]) {
global [color="#0000bb"]$SESS_DBHOST[color="#007700"], [color="#0000bb"]$SESS_DBNAME[color="#007700"], [color="#0000bb"]$SESS_DBUSER[color="#007700"], [color="#0000bb"]$SESS_DBPASS[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"];
if (! [color="#0000bb"]$SESS_DBH [color="#007700"]= [color="#0000bb"]mysql_pconnect[color="#007700"]([color="#0000bb"]$SESS_DBHOST[color="#007700"], [color="#0000bb"]$SESS_DBUSER[color="#007700"], [color="#0000bb"]$SESS_DBPASS[color="#007700"])) {
echo [color="#dd0000"]"
- MySQL Error: "
- Unable to select database $SESS_DBNAME"[color="#007700"];
echo [color="#dd0000"]"[color="#007700"]. [color="#0000bb"]mysql_error[color="#007700"]();
die;
}
if (! [color="#0000bb"]mysql_select_db[color="#007700"]([color="#0000bb"]$SESS_DBNAME[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"])) {
echo [color="#dd0000"]"[color="#007700"];
die;
}
return [color="#0000bb"]true[color="#007700"];
}
function [color="#0000bb"]sess_close[color="#007700"]() {
return [color="#0000bb"]true[color="#007700"];
}
function [color="#0000bb"]sess_read[color="#007700"]([color="#0000bb"]$key[color="#007700"]) {
global [color="#0000bb"]$SESS_DBH[color="#007700"], [color="#0000bb"]$SESS_LIFE[color="#007700"];
[color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"SELECT value FROM session_tbl WHERE sesskey = '$key' AND expiry > " [color="#007700"]. [color="#0000bb"]time[color="#007700"]();
[color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
if (list([color="#0000bb"]$value[color="#007700"]) = [color="#0000bb"]mysql_fetch_row[color="#007700"]([color="#0000bb"]$qid[color="#007700"])) {
return [color="#0000bb"]$value[color="#007700"];
}
return [color="#0000bb"]false[color="#007700"];
}
function [color="#0000bb"]sess_write[color="#007700"]([color="#0000bb"]$key[color="#007700"], [color="#0000bb"]$val[color="#007700"]) {
global [color="#0000bb"]$SESS_DBH[color="#007700"], [color="#0000bb"]$SESS_LIFE[color="#007700"];
[color="#0000bb"]$expiry [color="#007700"]= [color="#0000bb"]time[color="#007700"]() + [color="#0000bb"]$SESS_LIFE[color="#007700"]; [color="#ff8000"]//过期时间
[color="#0000bb"]$value [color="#007700"]= [color="#0000bb"]addslashes[color="#007700"]([color="#0000bb"]$val[color="#007700"]);
[color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')"[color="#007700"];
[color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
if (! [color="#0000bb"]$qid[color="#007700"]) {
[color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"UPDATE session_tbl SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " [color="#007700"]. [color="#0000bb"]time[color="#007700"]();
[color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
}
return [color="#0000bb"]$qid[color="#007700"];
}
function [color="#0000bb"]sess_destroy[color="#007700"]([color="#0000bb"]$key[color="#007700"]) {
global [color="#0000bb"]$SESS_DBH[color="#007700"];
[color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"DELETE FROM session_tbl WHERE sesskey = '$key'"[color="#007700"];
[color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
return [color="#0000bb"]$qid[color="#007700"];
}
function [color="#0000bb"]sess_gc[color="#007700"]([color="#0000bb"]$maxlifetime[color="#007700"]) {
global [color="#0000bb"]$SESS_DBH[color="#007700"];
[color="#0000bb"]$qry [color="#007700"]= [color="#dd0000"]"DELETE FROM session_tbl WHERE expiry [color="#007700"]();
[color="#0000bb"]$qid [color="#007700"]= [color="#0000bb"]mysql_query[color="#007700"]([color="#0000bb"]$qry[color="#007700"], [color="#0000bb"]$SESS_DBH[color="#007700"]);
return [color="#0000bb"]mysql_affected_rows[color="#007700"]([color="#0000bb"]$SESS_DBH[color="#007700"]);
}
[color="#0000bb"]session_set_save_handler[color="#007700"](
[color="#dd0000"]"sess_open"[color="#007700"],
[color="#dd0000"]"sess_close"[color="#007700"],
[color="#dd0000"]"sess_read"[color="#007700"],
[color="#dd0000"]"sess_write"[color="#007700"],
[color="#dd0000"]"sess_destroy"[color="#007700"],
[color="#dd0000"]"sess_gc"[color="#007700"]);
[color="#0000bb"]session_start[color="#007700"]();
[color="#0000bb"]?>
完成以上步骤后,在程序中使用require("session_inc.php")来代替session_start()即可,其他的session函数还是象以前一样的方法调用
相关阅读 更多 +