我正在用PHP开发一个网站。当用户会话开始时,我在$ _SESSION var中加载他所有的db行。当用户更改db值时,我也会更新$ _SESSION var。
如果同一用户有多个会话处于活动状态,则会启动此问题。有没有办法更新同一用户的所有会话的数据而不会使数据库超载?或者,有没有办法强制php为属于同一用户的所有会话使用相同的会话文件?或者我必须在每次会话继续时查询数据库?
另一个困境是:值得吗?我的意思是,我不知道这种机制可以减轻多少服务器负载,我不知道这种机制是否适用于基于文件的会话,或者我必须使用另一种会话存储类型。
此问题与this other question on mine有些相关(即使此方法只是删除所有会话文件)。
答案 0 :(得分:1)
它确实可以解决为什么你需要$ _SESSION中的许多数据。你应该花些时间来决定经常需要显示哪些数据。
在大多数情况下,您只需要保持用户登录的会话标识符(包含user_id
)直接从数据库中获取所需数据。
假设用户可以更改其头像,并且您没有去太多地方来显示此头像,则无需将其存储在会话中,也不需要同时存储SELECT
。例如,您可以设置一个触发页面,SELECTS
当{I}尝试向另一个用户发送个人消息时,$_SESSION['user_id']
。否则,您可以放置一个缓存(即使用memcached),其中选择用户头像的查询不应该超过每小时一次。
如果用户更改了电子邮件,则它是相同的。如果其他人试图向他发送消息,则触发SELECT查询。否则设置缓存。
所以,让我们说用户已经更改了他的头像,电子邮件,其他一些琐碎的信息,然后访问了你的索引页面。在他的会话中,您只加载标识符。在数据库中存在记录,但尚未选择它们。因此,您既没有服务器负载,也没有数据库负载会话,因为没有发送SELECT
个查询。
无论用户尝试设置其会话的次数(在这种情况下是第二次记录),您在db中都有一个当前数据,而一个会话只有一个标识符。您可以识别他的所有实例,但绝不使用不需要的数据。
答案 1 :(得分:0)
1好吧,我(不,但是)可以使用我的会话处理程序执行此操作。我使用数据库SESSIONS和一些额外的信息/列,如用户名和用户ID。这样我就可以准确地确定哪个会话属于哪个用户而没有使用序列化数据。
http://php.net/manual/de/function.session-set-save-handler.php
2但在您的情况下,更新用户表然后再次选择用户以将(新)数据放入$ _SESSION ['user']可能更简单。 (您将需要一些“用户数据已更新”信息,以便为所有会话重新加载新数据。)
3或者您只是避免用户可以多次登录。