PHP MySql存储数据24小时

时间:2009-07-14 09:13:41

标签: php mysql

我正在为我的网站建立一个顶级列表,而不是每24小时记录进出点击并清空数据库,我想在“过去24小时内”记录进出点击,这样顶级列表将始终看起来很忙无论你什么时候看它,同时仍然精确地排名网站。

所以基本上我必须在数据库中添加记录“in”命中(例如)并在24小时后将其删除,或者在对网站进行排名时不考虑它。

我想知道最有效的方法,我有一些想法,但它们看起来都非常重要。我希望你明白我想要实现的目标:)任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:3)

您不一定要一直删除“旧”数据。您还可以在查询数据时将数据集限制为过去24小时内的记录。

WHERE
  site='xyz'
  AND hit_datetime > Now()-Interval 24 hour

请参阅http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

答案 1 :(得分:1)

我会使用简单的

删除超过24小时的数据
DELETE...WHERE hit_time < now() - interval 24 hour

另一个问题是 - 什么时候打电话?权衡是在性能和​​陈旧数据之间进行权衡。你调用它的频率越高,数据就越少“陈旧”,但服务器负载会增长。

我看到了几种方法,选择最适合您需求的方法:

  • 在每个脚本的开头调用它。只有当脚本对命中数据执行某些操作时,才可以通过调用来优化此选项。这样每个脚本将始终使用“正确”数据运行。但是这将有最大负载。
  • 安排一个cron作业,每1h / 2h / 24h /等调用一次。这样会有一些“陈旧”的数据,但开销会减少到最低限度。
  • 就像PHP用会话一样 - 在每个脚本启动时给它一个x%(x是可配置的)运行机会。也就是说,取0到100之间的值,如果它小于x,则执行DELETE。

您还可以发明一些其他方案 - 例如,每个用户会话运行一次;或者只有当执行时间可以被7分钟均分时才能运行它;或者是其他东西。无论哪种方式,你都要权衡表现的正确性。

答案 2 :(得分:0)

编写存储过程,删除超过24小时的记录。然后编写一个在每个INSERT语句上运行的trigger并调用SP。

答案 3 :(得分:0)

你可以存储每个“点击”的时间戳,然后调用像

这样的查询
 $time = time()-86400;
 mysql_query("DELETE FROM xxx WHERE timestamp < $time");

或者你在SELECT语句中可以做同样的事情,取决于你之后是否还需要点击等等

答案 4 :(得分:0)

如果时间限制不是很难(例如,如果数据在数据库中保存的时间超过24小时,你会浪费钱或者真的让用户烦恼),我会使用PHP {{3}像这样:


function cleanup() {
  // open db-connection etc.
  $query = 'DELETE FROM <yourtable> ' .
               'WHERE UNIX_TIMESTAMP(<timstampfield>) < ' . (time() - 86400);
  mysql_query($query);
  // close connection
}

register_shutdown_function('cleanup');

上面的代码假定,&lt; timestampfield&gt; 是MYSQL-date-datatypes之一(TIMESTAMP,DATE,DATETIME)。