把session放入mysql

本文探讨了使用MySQL内存表存储Session数据的方法,包括创建表结构、自定义PHP session处理函数等,有效提升性能同时保障安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人想法,求指教!

放入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")

这样就完成了!

<think>嗯,用户的问题是关于如何用Python处理通过WiFi接收的数据并实时存入数据库。首先,我需要理解他们的具体需求。他们提到之前有参考信息,比如使用SQLAlchemy存储传感器数据到SQLite,还有Zigbee网络和ARM板传输数据到PC,以及前端展示使用AdminLTE和Echarts。看起来他们可能是在做一个物联网项目,需要实时处理传感器数据,并存储到数据库,可能后续还要做展示或者分析。 首先,我需要确定用户的数据来源。他们通过WiFi接收数据,可能数据是通过HTTP请求发送的,比如JSON格式,或者通过TCP/UDP传输。不同的传输方式需要不同的处理方法。例如,如果是HTTP,可能需要用Flask或Django来创建API接收数据;如果是TCP/UDP,可能需要使用socket库来监听端口。 然后,数据解析部分。假设数据是JSON格式,可能需要用json模块来解析。但如果数据是二进制格式,可能需要struct模块来解包。用户提到的参考引用中有使用time模块获取时间戳,所以可能需要在存储时添加时间戳。 接下来是数据库的选择。用户之前用过SQLite,但如果是实时动态更新,可能需要考虑更高效的数据库,比如MySQL或PostgreSQL,或者时间序列数据库如InfluxDB。不过对于实时性要求不是特别高的场景,SQLite可能也足够,但多线程入可能会有问题,所以需要确认是否高并发。 然后,数据存储部分。用户之前用SQLAlchemy,这是一个ORM工具,可以方便地与多种数据库交互。所以可能需要指导他们如何定义模型,建立会话,以及如何批量插入或实时插入数据。同时要注意数据库连接的持久化,避免频繁连接断开影响性能。 另外,用户提到需要动态更新的数据库,可能是指数据库结构会根据数据变化自动调整,或者数据不断追加。需要确认是否数据库表结构固定,还是需要动态创建表。通常建议预先定义好表结构,但如果有变化,可能需要动态迁移,这比较复杂。 还有实时处理方面,是否需要数据清洗或预处理。比如过滤无效数据,转换数据格式,或者计算某些指标。这部分需要在存储前完成,可能需要使用Pandas或者直接在Python中进行处理。 然后,异常处理也很重要。比如网络中断、数据格式错误、数据库连接失败等情况,需要有重试机制和日志记录。用户可能需要添加try-except块,记录错误信息,确保程序稳定运行。 关于性能优化,如果数据量很大,可能需要考虑异步处理,使用asyncio或者多线程,或者批量插入而不是逐条插入。参考引用中提到使用Django的数据库API,可能ORM已经优化了部分操作,但需要指导用户如何高效使用。 最后,测试部分。用户需要先用模拟数据测试整个流程,确保从接收到存储都正常,再连接真实数据源。参考引用中有提到用模拟数据测试数据库连接,所以可能需要指导他们如何生成测试数据,验证程序正确性。 总结步骤应该是:建立数据连接(HTTP/TCP/UDP)→解析数据→添加时间戳→连接数据库→定义数据模型→实时入→异常处理→测试优化。需要分步解释,并提供代码示例,比如使用Flask接收POST请求,解析JSON,用SQLAlchemy存储到SQLite或MySQL,同时处理时间戳和错误。可能还需要提到如何使用Web框架或异步库提高处理效率,以及如何监控数据库性能。</think>### 分步骤解决方案 #### 1. **建立数据接收通道** - **使用Socket或HTTP协议**:根据WiFi数据传输方式选择对应协议。若为TCP/UDP,使用Python的`socket`库监听端口;若为HTTP API,可用`Flask`或`FastAPI`构建接口[^2]。 ```python # 示例:Flask接收POST请求 from flask import Flask, request app = Flask(__name__) @app.route('/sensor', methods=['POST']) def receive_data(): data = request.get_json() return "Data received", 200 ``` #### 2. **数据解析与时间戳添加** - **JSON解析与数据清洗**:若数据格式为JSON,用`json`模块解析;若为二进制流,需用`struct`解包。 ```python import json import time def parse_data(raw_data): try: data = json.loads(raw_data) data['timestamp'] = int(time.time()) # 添加时间戳[^1] return data except json.JSONDecodeError: print("Invalid JSON format") return None ``` #### 3. **数据库建模与连接** - **选择动态数据库类型**:推荐使用支持高并发的数据库如**MySQL**或**PostgreSQL**,或时序数据库**InfluxDB**。 - **使用ORM工具**:通过`SQLAlchemy`定义数据模型,适配多类型数据库[^5]。 ```python from sqlalchemy import create_engine, Column, Integer, Float, DateTime from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class SensorData(Base): __tablename__ = 'sensor_data' id = Column(Integer, primary_key=True) temperature = Column(Float) humidity = Column(Float) timestamp = Column(DateTime) engine = create_engine('sqlite:///sensor.db') # 替换为MySQL/PostgreSQL连接字符串 Base.metadata.create_all(engine) ``` #### 4. **实时入数据库** - **批量提交优化性能**:使用`session.bulk_insert_mappings`减少IO次数。 ```python from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) def save_to_db(data): session = Session() try: session.bulk_insert_mappings(SensorData, [data]) session.commit() except Exception as e: session.rollback() print(f"Database error: {str(e)}") finally: session.close() ``` #### 5. **异常处理与日志记录** - **网络中断重试机制**:添加`retry`库实现自动重连。 ```python import logging from retry import retry logging.basicConfig(filename='sensor.log', level=logging.ERROR) @retry(tries=3, delay=2) def reliable_save(data): save_to_db(data) ``` #### 6. **动态更新验证** - **模拟数据测试**:生成模拟数据验证流程完整性。 ```python import random for _ in range(10): mock_data = { 'temperature': random.uniform(20, 30), 'humidity': random.uniform(40, 60), 'timestamp': int(time.time()) } reliable_save(mock_data) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

anssummer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值