PHP 和 SQL 社交网络 - 用户在线
Posted
技术标签:
【中文标题】PHP 和 SQL 社交网络 - 用户在线【英文标题】:PHP and SQL Social Networking - User Online 【发布时间】:2010-10-04 14:17:07 【问题描述】:我想在我的网站上设置在线检测。
我的用户表中有一行存储了上次登录日期时间。每次用户访问该站点时,他的登录日期都会更新,并且用户在线行设置为 1(1 - 在线,0 - 离线)。
如果上次登录是在 10 分钟或更长时间前,如何将在线行更改为 0(离线)?目的是找出日期之间的差异。
【问题讨论】:
【参考方案1】:cronjob 每 10 分钟一次?
UDPATE users SET online = 0 WHERE login_date > (NOW() - INTERVAL 10 minute);
【讨论】:
不需要cron。我在每个将进行查询的页面中都包含一个 header.php。 Cron 应该主要用于服务器端的东西,而不是真正的应用特定的。 这样的查询对于小型网站或测试来说是很实用的,但是如果您真的开始获得一些用户,请帮您的用户一个忙并将其更改为 cron 工作 - 否则您的页面加载时间将如果您要强制用户的连接为您处理数据库清理的负担,那么这将是零星且冗长的。 @RobertPitt 不是真的。 Cron 以多种方式使用,主要是为了分散服务器之间冗长操作(数据库查询)的负载,以避免通过按照您建议的方式实现网站使您的网站显得缓慢和迟缓。 假设在这个社交系统中实现了一个聊天系统,这将对谁在线和谁离线产生巨大影响。【参考方案2】:只是给每个用户添加一个 last_seen 时间戳到那里,这样当你做你的用户被验证时你可以更新时间
if(logged_in())
update_user();
function update_user()
//UPDATE users SET last_seen = unix_timestamp() WHERE uid = X;
然后你可以为你的用户做:
SELECT * FROM users WHERE last_seen > (unix_timestamp()-300)
获取最后 5 分钟。
【讨论】:
完整的登录函数长这样 function login($u, $p) $u = urldecode($u); $query = mysql_query("SELECT * FROM tbl_users WHERE user_email = '$u' AND user_password = '$p' LIMIT 1"); if(mysql_num_rows($query)) $user = mysql_fetch_array($query); setcookie('name', urlencode($user['user_email']), time() + 60*60*24*30); setcookie('pass', $user['user_password'], time() + 60*60*24*30); mysql_query("UPDATE tbl_users SET user_login_date = NOW() WHERE user_username = '$u'");返回 mysql_result($query, 0); 否则返回假; 那里存在很大的安全漏洞。【参考方案3】:如果要显示最近 10 分钟内在线的用户,那么最好的方法是在 sql 查询中包含日期时间条件。
【讨论】:
【参考方案4】:将上次登录时间保存为时间戳,然后您可以轻松地将其与当前时间进行比较,并了解自那时以来已经过去了多少时间。
根据您的用户表的大小,您可以在每次有人访问您的网站时检查那些仍然在线的人。
另一种方法是将活动用户存储在存储桶中,并标有上次登录时间,然后您可以轻松重置存储桶中超过 10 分钟的所有用户。
【讨论】:
以上是关于PHP 和 SQL 社交网络 - 用户在线的主要内容,如果未能解决你的问题,请参考以下文章