0

我正在用 PHP 开发一个网站。当用户会话开始时,我将他的所有数据库行加载到 $_SESSION 变量中。当用户更改数据库值时,我也会更新 $_SESSION var。

当同一用户有多个会话处于活动状态时,问题就开始了。有没有办法在不使数据库超载的情况下更新同一用户的所有会话的数据?或者,有没有办法强制 php 对属于同一用户的所有会话使用相同的会话文件?或者我必须在每次会话继续时简单地查询数据库?

另一个难题是:值得吗?我的意思是,我不知道这种机制能在多大程度上减轻服务器负载,也不知道这种机制是否适用于基于文件的会话,或者我必须使用另一种会话存储类型。

这个问题与我的另一个问题有些相关(即使解决方法只是删除所有会话文件)。

4

2 回答 2

1

它确实解决了为什么在 $_SESSION 中需要很多数据的问题。你真的应该花点时间来决定经常需要显示哪些数据。

在大多数情况下,您只需要使用户保持登录状态的会话标识符,包含user_id,以直接从数据库中获取所需的数据。

假设用户可以更改其头像,并且您没有去很多地方显示此头像,则无需将其存储在会话中,也无需同时存储SELECT。例如,您可以有一个触发页面,当他试图向另一个用户发送个人消息时SELECTS,化身通过该页面。$_SESSION['user_id']否则,您可以将缓存(即使用 memcached)放置在查询的位置,该查询选择用户头像的频率不应超过每小时一次。

如果用户更改电子邮件,则相同。如果其他人试图向他发送消息,您将触发 SELECT 查询。否则设置缓存。

因此,假设用户更改了他的头像、电子邮件和其他一些琐碎信息,然后访问了您的索引页面。在他的会话中,您只加载标识符。在数据库中,记录存在,但尚未选择。因此,您既没有服务器负载,因为会话很轻,也没有数据库负载,因为没有SELECT发送查询。

无论用户尝试设置他的会话多少次(在这种情况下是第二次记录),您在数据库中都有一个当前数据,并且会话只有标识符。您可以识别他的所有实例,但永远不要使用不需要的数据。

于 2013-09-23T10:00:04.223 回答
0

1 好吧,我(不,但是)可以用我的会话处理程序来做到这一点。我使用带有一些额外信息/列的数据库会话,例如用户名和用户 ID。这样我就可以准确地确定哪个会话属于哪个用户,而无需摆弄序列化数据。

http://php.net/manual/de/function.session-set-save-handler.php

2 但在您的情况下,更新您的用户表然后再次选择用户以将(新)数据放入 $_SESSION['user'] 可能更简单。(您将需要一些“用户数据已更新”信息,以便为所有会话重新加载新数据)。

3 或者您只是避免用户可以多次登录。

于 2013-09-23T08:59:32.117 回答