2009-07-14 12 views
0

Ich baue eine Topliste für meine Website und statt alle 24 Stunden Treffer aufzeichnen und leeren die Datenbank würde ich gerne "innerhalb der letzten 24 Stunden" in und aus Treffer aufzeichnen Auf diese Weise wird die Toplist immer beschäftigt, egal zu welcher Zeit Sie es betrachten, während immer noch Ranking-Websites.PHP MySql Speichern von Daten für 24 Stunden

Also im Grunde muss ich einen Datensatz in die Datenbank hinzufügen einen 'in' Treffer (zum Beispiel) und die Entfernung etwa 24 Stunden später, oder einfach nicht berücksichtigen, wenn Sie die Websites rangieren.

Ich möchte die effizienteste Art und Weise, dies zu tun wissen, habe ich einige Ideen, aber sie scheinen alle wirklich Ressourcen schwer. Ich hoffe du verstehst was ich versuche zu erreichen :) Jede Hilfe wäre willkommen.

Antwort

3

Sie müssen nicht immer "alte" Daten löschen. Sie können den Datensatz auch auf Datensätze innerhalb der letzten 24 Stunden beschränken, wenn Sie Daten abfragen.

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

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

+0

Das ist offensichtlich der Weg, hier zu gehen, imho. – n3rd

+0

Es ist eine gute Lösung, aber wenn Sie wie viel Verkehr haben, würde ich das von vilx- betrachten, da es eine riesige Tabelle mit der Zeit – Flo

+1

erstellen könnte, die "viel Verkehr" definiert. Wenn Sie alte Datensätze immer löschen, treffen Sie eine Menge auf den Index und die Datendatei, die nicht unbedingt ein Performance-Boot ist. Wenn Sie dies in Intervallen tun, brauchen Sie trotzdem irgendwas wie diesen WHERE-Klausel, um trotzdem genaue Ergebnisse zu erhalten und der Gewinn der INSERT/SELECT-Geschwindigkeit wegen der verringerten Datenmenge ist wahrscheinlich vernachlässigbar, wahrscheinlich sogar bis zum DELETE-Vorgang "aufgefressen" dauerte. Wenn Speicherplatz ein Problem ist (wenn!) Können Sie alte Aufzeichnungen von Zeit zu Zeit löschen, alle n Tage, wenn der Ölpreis fällt, wenn Ihr Nachbar von Aliens entführt wird (wieder) ... – VolkerK

0

Eine gespeicherte Prozedur schreiben, die Datensätze löscht, die älter als 24 Stunden sind. Schreiben Sie dann eine trigger, die auf jeder INSERT-Anweisung ausgeführt wird und den SP aufruft.

0

Sie können den Zeitstempel speichern mit jedem „Hit“ und dann eine Abfrage wie

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

oder man konnte elbe innerhalb der SELECT-Anweisung, hängt davon ab, ob Sie noch die Hits danach brauchen, etc

0

Wenn die Zeit-Einschränkung nicht wirklich schwer ist (zB Sie Geld oder sind wirklich ärgerlich, die Benutzer, wenn die Daten aufbewahrt werden in der der db länger als 24 Stunden verlieren werden), ich würde den Einsatz von PHP register_shutdown_function wie folgt verwenden:


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

der obige Code wird davon ausgegangen, <timestampfield> ist einer der die MYSQL-date-Datentypen (TIME STEMPEL, DATUM, DATETIME).

+1

+86400 muss -86400 sein sonst ist alles weg – Flo

+0

flo, natürlich! behoben :-/ – Argelbargel

1

würde ich die Daten löschen, die mit einem einfachen älter als 24 Stunden ist

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

Die andere Frage ist - wenn es zu nennen? Der Kompromiss besteht zwischen Leistung und veralteten Daten. Je öfter Sie es nennen, desto weniger "veraltete" Daten gibt es, aber die Serverlast wird wachsen.

Ich sehe mehrere Ansätze, eine auswählen, die Ihren Bedürfnissen am meisten entspricht:

  • es am Anfang jedes Skript aufrufen. Dies kann optimiert werden, indem es nur aufgerufen wird, wenn das Skript etwas mit den Trefferdaten macht. Auf diese Weise läuft jedes Skript immer mit "korrekten" Daten. Dies hat jedoch die maximale Belastung.
  • Planen Sie einen Cron Job und rufen Sie ihn einmal alle 1h/2h/24h/etc. Auf diese Weise wird es ein wenig "veraltete" Daten geben, aber der Overhead wird auf ein Minimum reduziert.
  • Machen Sie es wie PHP tut es mit Sitzungen - bei jedem Start Skript geben Sie eine x% (x ist konfigurierbar) Chance ausgeführt werden. Das heißt, nehmen Sie einen Wert von 0 bis 100, und wenn es kleiner als x ist, führen Sie die DELETE aus.

Sie können auch andere Schemata erstellen - z. B. einmal pro Benutzersitzung; oder führe es nur aus, wenn die Ausführungszeit gleichmäßig durch z. B. 7 geteilt werden kann; oder etwas anderes. In beiden Fällen tauschst du Performance für Korrektheit ab.

Verwandte Themen