我试图在他们的个人资料页面中向我的网站用户显示时间/日期(这决定了他们访问我网站的最后时间)。完全像这样:
那么如何计算(8分钟前)的数字?
目前我有一张这样的表:
// requests
+----+----------+-------------+
| id | id_user | unix_time |
+----+----------+-------------+
| 1 | 2353 | 1339412843 |
| 2 | 2353 | 1339412864 |
| 3 | 5462 | 1339412894 |
| 4 | 3422 | 1339412899 |
| 5 | 3422 | 1339412906 |
| 6 | 2353 | 1339412906 |
| 7 | 7785 | 1339412951 |
| 8 | 2353 | 1339413640 |
| 9 | 5462 | 1339413621 |
| 10 | 5462 | 1339414490 |
| 11 | 2353 | 1339414923 |
| 12 | 2353 | 1339419901 |
| 13 | 8007 | 1339424860 |
| 14 | 7785 | 1339424822 |
| 15 | 2353 | 1339424902 |
+----+----------+-------------+
如上所示,存储了我所有网站的请求。我的意思是当用户打开(加载)我网站的任何页面时,我在该表中插入一个新行。然后计算 last_seen ,我只选择该特定用户的最后一行并使用unix_time
值。
说实话,我猜我做的事情是错的(或者至少不是标准的)。因为计算 last_seen 需要花费很多。
前几天,我在服务器中看到一个名为access_log.txt
的文件,其中包含所有请求。现在我想知道我可以使用该文件吗?它还会比我目前的方法(使用数据库)更好吗?总的来说,我如何为每个用户计算 last_seen ?
答案 0 :(得分:4)
只需使用Datetime::diff
,从用户X的数据库中的最后一个条目获取时间戳。然后创建2个日期时间对象,第一个使用旧代码,第二个使用当前时间。然后调用diff
并交出当前时间戳。
$datetime1 = new DateTime(date('Y-m-d H:i:s', 1339412843));
$datetime2 = new DateTime(date('Y-m-d H:i:s'));
$diff = $datetime1->diff($datetime2);
echo $diff->y.' Years <br/>';
echo $diff->m.' Months <br/>';
echo $diff->d.' Days <br/>';
echo $diff->h.' Hours <br/>';
echo $diff->i.' Minutes <br/>';
echo $diff->s.' Seconds <br/>';
<强>附录强> 您当前的方法是正确的。计算mysql中的时间差异并不像解析访问日志那样昂贵。使用sql,这是1个查询执行,2个要创建的对象和至少1个函数调用。
如果要使用访问日志,则始终必须解析完整访问日志。解析所有行,然后过滤掉不相关的行,只保留用户登录的最后一行。如果你的apache已经旋转了日志,你还必须在其他日志中搜索你还必须解压缩。
我会保留您当前的策略并尝试对其进行优化,例如
答案 1 :(得分:1)
根据活动的数量(想想这个论坛!),你可能想要一个&#34;推送&#34;模型而不是&#34;拉&#34;模型。
&#34;拉&#34;:当用户加载页面时,从数据库中获取一些日期并计算&#34;最后一次看到&#34;。
&#34;推送&#34;:跟踪谁在观看信息。然后,当某些事情发生变化时,&#34;推送&#34;给听众的信息。这将涉及额外的表格和额外的代码来协调&#34; push&#34;。