将数据信息存储在SESSION中而不是使用MySQL查询?

时间:2014-12-13 08:28:07

标签: php mysql facebook session notifications

我有类似Facebook的通知系统,用户可以根据在哪个特定网站上发布/喜欢/评分的人来获取通知。

当您成为某些内容的创建者或者您使用以下mysql语句发布了特定内容时,您会收到通知:

SELECT  
n.`id`,n.`site`,n.`site_id`,n.`creator_uid`,n.`type`,
nu.`id` AS nuid, nu.`uid` AS nu_uid, nu.`date`,
nr.`id` AS nrid, nr.`uid` AS nr_uid, nr.`is_read`,
u.`gender`

FROM `notification` AS n
LEFT JOIN `notification_user` AS nu ON nu.`nid` = n.`id`
LEFT JOIN `notification_read` AS nr ON nr.`nid` = n.`id` 
LEFT JOIN `users` AS u ON u.`id` = nu.`uid` 
WHERE 
    nu.`uid` != '".$_SESSION['uid']."' AND nr.`uid` = '".$_SESSION['uid']."'
    OR
    (
    nu.`uid` = '".$_SESSION['uid']."' AND n.`type` = 'credits'
    )
ORDER BY date DESC, nu.`id` DESC 
LIMIT 7

现在我已经构建了一个朋友系统,我也希望将我朋友的活动显示为通知。我想把它构建到语句中,但是这个语句被加载到整个网站的每一页上,我认为这对于性能来说已经很难了。所以每次都要通过users_friends表来收集"收集"我想,我的朋友用户ID对于性能来说会更难。所以我想把这个朋友的用户ID数据存储在我的SESSION中,如下所示:

// get friends user ids
$result = mysql_query("SELECT 
CASE 
WHEN `sent_uid`='".$_SESSION['uid']."' THEN `get_uid`
WHEN `get_uid`='".$_SESSION['uid']."' THEN `sent_uid`
END AS uid

FROM `users_friends` WHERE `status`='1' AND 
(`get_uid`='".$_SESSION['uid']."' OR `sent_uid`='".$_SESSION['uid']."')
") or die(mysql_error());
$i=1;
    $num_rows = mysql_num_rows($result);
if (!empty($num_rows) && empty($_SESSION['friends']))
{
    while ($data = mysql_fetch_assoc($result))
    {   
    $_SESSION['friends'][] = $data['uid'];
    }
}

现在我有一个名为$_SESSION['friends']的数组,其值为" 39,2,49"例如。我现在还没想过在通知查询中实现这个,因为我想首先询问这个尝试是否合理,还是我应该采取其他方式来做到这一点?我很感激任何建议。

2 个答案:

答案 0 :(得分:1)

为什么在做得更少并拥有更好的解决方案时会做更多的事情?:) 为什么要用逗号分隔字符串?只需将其存储为数组即可。这样你可以做各种事情,比如search array, etc,当你需要逗号分隔的字符串时,你可以使用implode() function

此外,如果如果$ _SESSION ['friends']被填充则不需要查询数据库,请将查询带入条件块。

if (empty($_SESSION['friends'])) {
    $result = mysql_query(...);
    while ($data = mysql_fetch_assoc($result)) {   
        $_SESSION['friends'][] = $data['uid'];
    }
}

答案 1 :(得分:1)

你可以实现类似的东西,但恕我直言,你需要一个缓存方法。

这取决于几个因素,但作为一般规则,我不会使用会话来存储应该保留的数据。在这种情况下,我会做类似的事情:

  1. 安装APC(或其他缓存系统)
  2. 如果您使用Laravel或其他一些PHP FW处理缓存将非常容易,无论如何...执行一个函数来获取您的查询,并在此函数内检查基于缓存密钥的用户ID。如果缓存键存在,则返回其值,否则查询数据库并将结果保存在缓存中。
  3. 每次更新此用户好友列表的数据时,请清除与用户相关的缓存密钥。
  4. 通过这种方式,您可以保留数据并避免数据库锤击和会话变通。

    只是一个想法,希望它有所帮助或启发。好看!