如何创建计算上次看到的时间的系统

时间:2016-06-23 13:08:31

标签: php mysql algorithm performance

我试图在他们的个人资料页面中向我的网站用户显示时间/日期(这决定了他们访问我网站的最后时间)。完全像这样:

enter image description here

那么如何计算(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

2 个答案:

答案 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;。