在开发一个更大的用户驱动站点时,每个登录用户在浏览站点时都需要大量的帐户数据,在会话中可以轻松访问这些数据与需要阅读它之间的平衡是什么来自数据库。在会话中保留大部分内容以减少已经频繁访问数据库的内容很诱人。我特别想到的是像在线游戏这样的场景,其中有很多用户为他们的玩家提供了大量数据。
答案 0 :(得分:2)
我建议你在会话中使用一个简单的标识符来从db中检索信息,但是对于性能问题,请使用缓存。因此,如果数据位于缓存中,则从db。
获取示例:
class User {
public $username ="";
public $moredata ="";
public function logged() { // return true if logged }
}
$ttl = 10000 // cache time to live
if($_POST['action'] == 'login') {
$user = new User();
// populate $user, check credential...
$_SESSION['loggeduser'] = $user->username;
// saved data on db
apc_add ( $_SESSION['loggeduser'] , $user ,$ttl )
}
// ....
if($_SESSION['loggeduser']) {
$user = new User();
$user->username = apc_fetch( $_SESSION['loggeduser'],$success )
if(!$success)
$user = populateFromDb( $_SESSION['loggeduser']);
}
答案 1 :(得分:1)
如果您正在谈论的数据正在每个页面加载上使用,那么将其存储在会话中可能会没问题。如果大多数这些数据都没有在每个页面加载时使用,那么将它存储在数据库中(I.E.,每次都运行查询)可能是要走的路。您还可以使用会话缓存(类似于memcache)在每个会话中查询数据1次,然后在下次从缓存中获取。在会话中存储内容的问题是每个页面加载此数据都在内存中,如果它是大量数据,如果您有大量连接或长时间运行连接,则会严重影响服务器上的负载。
答案 2 :(得分:0)
这实际上取决于每个用户拥有多少价值。如果有动态值,也可以是用户名(可以更改,或者名字和姓氏。)
我总是使用UserID
作为季节,并使用一些查询来显示重要信息。
同时使用:)
答案 3 :(得分:0)
答案:两者。
会话中的数据在到期后会丢失,因此每次sessino丢失时都会将数据从数据库恢复到会话中。
一次处理多个用户的站点,用户数据很多,我总是使用RAM密钥/值驱动的数据库(Redis,Memcached,..)作为后端(session.handler)。 / p>
数据需要快速访问。
但是,不是将所有内容都放入SESSION,而是将ID放在那里。 其余的仍然进入Memcached并且您只加载您真正需要的数据,因此,您在服务器上的 PHP进程确实消耗了更少的内存。
所以你有超快数据的好处,现在做一些数学运算:
如果您的所有用户,即1kk,每个1 KB的数据,这是~1 GB。服务器现在有多少内存? 16-256 GB内存 - RAM中所有用户数据的足够空间。