PHP MySql Хранение данных в течение 24 часов - PullRequest
0 голосов
/ 14 июля 2009

Я создаю топлист для своего сайта, и вместо записи входов и выходов и очистки базы данных каждые 24 часа я хотел бы записывать входящие и исходящие хиты «в течение последних 24 часов», таким образом топлист всегда будет Выглядите занятым, независимо от того, в какое время вы смотрите на него, в то же время тщательно оценивая сайты

Так что в основном мне придется добавить в базу данных запись, в которой регистрируется попадание (например), и удалить ее примерно через 24 часа, или просто не учитывать ее при ранжировании сайтов.

Я хочу знать наиболее эффективный способ сделать это, у меня есть некоторые идеи, но все они кажутся действительно ресурсоемкими. Я надеюсь, вы понимаете, чего я пытаюсь достичь :) Любая помощь будет оценена.

Ответы [ 5 ]

3 голосов
/ 14 июля 2009

Вам не обязательно постоянно удалять «старые» данные. При запросе данных вы также можете ограничить набор данных записями за последние 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 голос
/ 14 июля 2009

Я бы удалил данные старше 24 часов с помощью простого

DELETE...WHERE hit_time < now() - interval 24 hour

Другой вопрос - когда это назвать? Компромисс между производительностью и устаревшими данными. Чем чаще вы будете это называть, тем меньше будет устаревших данных, но нагрузка на сервер будет расти.

Я вижу несколько подходов, выберите тот, который больше всего соответствует вашим потребностям:

  • Называйте это в начале каждого сценария. Это можно изменить, вызвав его, только если скрипт будет что-то делать с данными попаданий. Таким образом, каждый скрипт всегда будет работать с «правильными» данными. Однако это будет иметь максимальную нагрузку.
  • Запланируйте работу cron и вызывайте ее один раз каждые 1 час / 2 часа / 24 часа / и т. Д. Таким образом, будет немного «устаревших» данных, но издержки будут сведены к минимуму.
  • Делайте это так, как PHP делает это с сеансами - при каждом запуске скрипта дайте ему шанс x% (x настраивается) на запуск. То есть, принять значение от 0 до 100, и если оно меньше x, выполнить DELETE.

Вы также можете придумывать некоторые другие схемы - например, запускать их один раз за сеанс пользователя; или запускайте его, только если время выполнения делится, скажем, на 7; или что-то другое. В любом случае вы компенсируете производительность за правильность.

0 голосов
/ 14 июля 2009

Если временные ограничения не очень жесткие (например, вы теряете деньги или действительно раздражаете своих пользователей, если данные хранятся в БД более 24 часов), я бы использовал PHP register_shutdown_function как это:


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');

В приведенном выше коде предполагается, что относится к одному из типов данных MYSQL-date (TIMESTAMP, DATE, DATETIME).

0 голосов
/ 14 июля 2009

вы можете хранить отметку времени при каждом «ударе», а затем вызывать запрос типа

 $time = time()-86400;
 mysql_query("DELETE FROM xxx WHERE timestamp < $time");

или вы можете сделать то же самое в операторе SELECT, зависит от того, нужны ли вам обращения после этого и т. Д.

0 голосов
/ 14 июля 2009

Напишите хранимую процедуру, которая удаляет записи старше 24 часов. Затем напишите триггер , который выполняется для каждого оператора INSERT и вызывает SP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...