把session放入mysql

80 篇文章 0 订阅
43 篇文章 0 订阅

个人想法,求指教!

放入mysql中,可以考虑放入内存表:

把会话数据放入mysql内存表中性能可以提升不少. 
但是碰到的问题是,内存表如果来保寸大数据的会话值, 
因为内存表不支持text,blog类型,  用varchar的话5.0.35以上版本可以支持65535的数据量, 
不知道这样设计可以不可以,内存会不会消耗很快,性能会下降. 
所以想请教下各位, mysql 内存表来保存session的方案, 

实现代码:

session通常放在/tmp目录下,而该文件夹的权限是everbody可读,这个就非常可怕了!学校的论坛曾经就有人通过session来盗取帐号!所以后来就尝试把session放入数据库,表的结构和过程如下:
//创建表
//create sesslib.sql
CREATE TABLE sesslib ( 
data text, 
time datetime, 
id int(11) DEFAULT @#0@# NOT NULL auto_increment, 
sid varchar(32) NOT NULL, 
PRIMARY KEY (id), 
UNIQUE sid (sid) 
);
//End

//XX.php自定义了session的数据库路径,当某个页面需要使用//session时,可以include这个部分,使用方法为: 
<? 
include "XX.php";//XX.php 
session_start(); 
//以下就可以正常使用session了 
?>

/******************************************************/ 
XX.php 内容: 
/*****************************************************/ 
<? 
$sess_dbh=""; 
$sess_maxlifetime=get_cfg_var("session.gc_maxlifetime");


function sess_open($save_path, $session_name) { 
global $hostname, $dbusername, $dbpassword, $dbname, $sess_dbh; 
//$sess_dbh=mysql_pconnect($hostname,$dbusername,$dbpassword) or die("不能连接数据库!"); 
$sess_dbh=mysql_pconnect(@#localhost@#,@#test@#,@#test@#) or die("不能连接数据库!");

// mysql_select_db("$dbname") or die("不能选择数据库!"); 
mysql_select_db(@#test@#) or die("不能选择数据库!"); 
return(true); 
}


function sess_close() { 
//mysql_close(); 
return(true); 
}

function sess_read($sid) { 
global $sess_dbh;

$result = mysql_query("select data from sesslib where sid=@#$sid@#", $sess_dbh); 
$n=mysql_num_rows($result); 
if($n==0) { 
return(""); 

else { 
$sess_data=mysql_result($result,0); 
return($sess_data); 

}


function sess_write($sid, $sess_data) { 
global $sess_dbh; 
if(!empty($sess_data)){ 
$r=mysql_query("insert into sesslib set sid=@#$sid@#,data=@#$sess_data@#,time=now()", $sess_dbh); 
if(!$r) { // insertion failed, means the session is already there, update it 
$r=mysql_query("update sesslib set sid=@#$sid@#, data=@#$sess_data@#, time=now() where sid=@#$sid@#",$sess_dbh); 

return $r; 
}}


function sess_destroy($sid) { 
global $sess_dbh;

$r=mysql_query("delete from sesslib where sid=@#$sid@#", $sess_dbh); 
return($r); 
}


function sess_gc($maxlifetime)
global $sess_dbh, $sess_maxlifetime;

$r=mysql_query("delete from sesslib where unix_timestamp(now())-unix_timestamp(time)>$sess_maxlifetime", $sess_dbh); 
return mysql_affected_rows($sess_dbh); 
}

session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy","sess_gc")

这样就完成了!

好的,我可以为您提供参考代码,如下所示: ```python from flask import Flask, render_template, request, redirect, url_for from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(120), nullable=False) @app.route('/') def index(): return render_template('index.html') @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User(username=username, password=password) db.session.add(user) db.session.commit() return redirect(url_for('login')) return render_template('register.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username).first() if user and user.password == password: return redirect(url_for('dashboard')) return render_template('login.html') @app.route('/dashboard') def dashboard(): return render_template('dashboard.html') if __name__ == '__main__': app.run(debug=True) ``` 在这里,我们使用 Flask 构建应用程序,使用 SQLAlchemy 进行数据库操作和数据模型定义。`User` 模型定义了 `id`、`username` 和 `password` 字段。在 `register` 视图函数中,我们接收 POST 请求并使用传递的表单数据创建 User 对象。在 `login` 视图函数中,我们确保用户输入的用户名和密码与数据库中的 User 模型匹配,如果匹配成功,我们将用户重定向到仪表板。此外,在 `config` 中,我们指定了连接到 MySQL 数据库的参数。 您可以将此代码放入 `app.py` 文件中并使用以下命令运行应用程序: ``` $ export FLASK_APP=app.py $ flask run ``` 在浏览器中开始 `http://localhost:5000` 以查看启动的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anssummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值