php中需要保存长久的数据

服务器端需要保存一个月+以上的信息,是不是应该存到数据库中?

我是直接自己封装方法去读写数据库建表,还是去更改php.ini配置session?php用的不多,这块看的很乱,说php的session是存在文件里的,不适合大流量和长期保存的数据。。

还有什么“把session存到数据库中”,这样就是去要更改php.ini的配置,这样岂不是不能用原来的session写短期数据了么?本来我这个服务器还有多个站点,一改php.ini,万一其他站点出问题呢?

这块感觉好乱,这个session会话状态到底什么意思啊。

阅读 6.1k
6 个回答

PHP内置的那套session机制默认是基于文件存储的,cookie内容就是session_id,对应到服务器那个session文件,注意这个session_id跟当前用户的id是没有关联的,也就是同样的用户执行两次登录,那么保存在上一次的session文件中的数据就会丢失(因为生成的session_id不同,对应的session文件自然也就不同).显然这个方案是不适合楼主持久存储用户数据的(比如商城购物车).

这时就需要自己实现一套session存储机制,比如下面是基于MySQL实现:

CREATE TABLE sessions (
    user_id int(10) unsigned NOT NULL,
    session text NOT NULL,
    md5 char(32) NOT NULL,
    PRIMARY KEY (user_id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

其中:
user_id存储的是用户ID,作为主键.
session存储的是用户的会话数组经过serialize或json_encode后的字符串.
md5存储的是session字段的MD5值,用于实现Check And Set版本号乐观锁(本质不是锁,而是写时检查,适合并发冲突少的情况):

--读取会话
SELECT session, md5 --写入会话时需要用到这里查出来的md5,就是下面的$last_md5
FROM sessions WHERE user_id = $user_id
--写入会话
UPDATE sessions
SET session = $str, md5 = md5($str)
WHERE user_id = $user_id 
AND md5 = $last_md5 --检查MD5,确保session字段没有被修改过

写入时除了要注意检查MD5,还要注意用mb_strlen检查session字符串长度,
不能超过text类型字段的最大限制(floor((65535-2)/3)=21844个utf8字符).

有了这套会话机制,你可以用它来存储各种持久化的会话数据,包括购物车/观看历史/收藏夹等等功能,不过因为这些用户数据保存在一个非结构化的字段里,所以并不利于用SQL进行数据分析,所以如果你需要进行数据分析,最好还是根据特定功能建对应的表,比如购物车表,通过用户id把其关联起来.

有必要落入db

数据库或者文件都可以,不建议用session。session是针对每个用户存在的,不能共用。

肯定放在数据库比较好

  1. 保存长久的数据,方便和持久的,要么存在数据库要么存在文本上,相比较文本而言,存在数据库中读取更方便一些;

  2. session会话机制,提到session就不得不提到cookie,当浏览器发送请求的时候,会话就已经建立了,cookie是以文件的形式保存在本地客户端,而session保存在服务器上。浏览器关闭,会话就结束。就像你做一个登陆的网站,把用户信息存在session中,判断session中是否存值一样的道理,就算当前窗口关闭,再次打开也是不用重新登录。只要浏览器不关掉session也一直存在。重新打开又是一个新的session

用Redis吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题