PHP Tägliche Anzahl an Donwloads in DB speichern

M

Mr. Snoot

Gast
Hio,

ich möchte die tägliche Anzahl an Downloads mehrerer Dateien (~ 50 Stück) in einer DB speichern (quasi ein Clickcounter).

Mir fallen dazu zwei Möglichkeiten ein, aber beide erscheinen mir wenig sinnvoll:

  1. Pro Tag und pro Datei erzeuge ich eine neue Zeile in der DB. Das würde also pro Monat ~1500 neue Einträge geben -> DB wird riesig
  2. Ich speichere pro Datei alles in einem Feld, also z.B. YYYYMMDD Anzahl|20090301 18|20090302 21|20090303 15|20090304 17|20090305 8|... Das würde natürlich zum Aufbereiten der Daten sehr umständlich
Wie ließe sich das am besten lösen?
 
wozu brauchst du eine tägliche auflistung? zähl doch einfach den counter immer höher und zum schluss musst du diesen nur noch durch die anzahl an tagen, seitdem der download in die db eingetragen wurde, dividieren. hier hast du zwar nur einen durchschnittswert, aber dieser reicht imo alle male aus und du bekommst keine unmengen an daten zusammen. oder gibt es einen speziellen grund, wieso du eine tägliche auflistung brauchst?

btw: verwende für das datum lieber timestamps (siehe time()), anstatt diesem festen datum.
 
Ich würd ab einer bestimmten Anzahl an Tagen, so ein Monat oder so die alten Datensätze halt löschen lassen bzw. in eine andere DB archivieren.
 
Also kurz gesagt: es geht nicht? :D

Ich würde einfach gerne die tägliche Verteilung sehen - wenn es denn einfach möglich ist, aber scheinbar ja nicht. Habe schon überlegt, ob ich das ganze nicht vielleicht in Textdateien packen soll und pro Mnat eine neue Datei anlege. Ist zwar im Grunde auch nichts anderes als die DB-Lösung, aber irgendwie erscheint es mir bei txts nicht so überdimensioniert :)
 
Ich würde die Downloads jeden Tag um 24 h auslesen/auf Null setzen und dann in eine html Datei in eine Tabelle schreiben.
 
Hier mal mein Beispiel welches quasi in Echtzeit stattfinden kann, also dann, wenn man einen Download startet (Download-Link z. B. mit XMLRequest / AJAX)-Handler erweitern, der dann beim OnClick den Request auslöst um so den Counterstand in der DB zu erhöhen.)

Natürlich sollte noch entsprechende Indizes zu der Tabelle erstellt werden!

Datenbank "test" erstellen
Code:
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)

Tabelle "download_tracker" in Datenbank "test" erstellen
Code:
mysql> CREATE TABLE download_tracker ( id mediumint(8), counter mediumint(8), date date);
Query OK, 0 rows affected (0.01 sec)

Neuen Datensatz einfügen (muss z. B. mit PHP ermittelt werden, ob schon für den aktuellen Tag bereits ein Datensatz vorliegt, den sonst weiter mit UPDATE
Code:
mysql> INSERT INTO download_tracker (counter, date) VALUES (1, CURDATE());
Query OK, 1 row affected (0.00 sec)

Kontroll-Ausgabe
Code:
mysql> SELECT * FROM download_tracker WHERE date = CURDATE();
+------+---------+------------+
| id   | counter | date       |
+------+---------+------------+
| NULL |       1 | 2009-03-13 |
+------+---------+------------+
1 row in set (0.00 sec)

UPDATE eines Bestehenden Datensatzes
Code:
mysql> UPDATE download_tracker SET counter = counter + 1 WHERE date = CURDATE();
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Kontroll-Ausgabe
Code:
mysql> SELECT * FROM download_tracker WHERE date = CURDATE();
+------+---------+------------+
| id   | counter | date       |
+------+---------+------------+
| NULL |       2 | 2009-03-13 |
+------+---------+------------+
1 row in set (0.00 sec)

So kannst Du dann bequem Auswertungen über die tägliche Download-Anzahl "fahren" oder über einen bestimmten Zeitraum:
Code:
mysql> SELECT SUM(counter) AS total_downloads FROM download_tracker WHERE date BETWEEN '2009-03-01'  AND CURDATE();
+-----------------+
| total_downloads |
+-----------------+
|               2 |
+-----------------+
1 row in set (0.00 sec)
 
Zuletzt bearbeitet:
Gruml schrieb:
in eine html Datei in eine Tabelle schreiben.
Klingt eigentlich gar nicht so schlecht, werd ich mal drüber nachdenken :)

@ excalibur1976: das Problem ist, in welcher Art und Weise man die Daten speichern soll, nicht wie man so einen Counter realisiert :)
 
Zuletzt bearbeitet:
Die Art & Weise ist doch in meinem Beispiel aufgeführt :)

Es kommt immer drauf an, wie genau Du es brauchst: Reicht Dir eine Tagesstatistik über den Gesamtcounterstand, dann ist mein Beispiel ok.

Speichern in einer Datenbank wie MySQL halte ich für optimaler (Es sei den Du willst nur den reinen Tagescounter und nicht mehr).

Willst Du ein genaues Tracking inkl. Datum Uhrzeit, IP-Adresse etc. haben, kommst Du um einen Datensatz pro Download nicht drum rum.

Dadurch wächst natürlich die Datenbank schnell. Aber was ist daran schlimm? Dafür ist eine Datenbank da. Datensätze in einer Tabelle mit 1 Mio. Zeilen und mehr sollten kein Problem sein.

Zumal Du ja Quartalsweise / Jahresweise die Daten in eine Archiv-Tabelle / Archivdatenbank speichern kannst (mittels Cronjob z. B.)
 
Zuletzt bearbeitet:
Und was soll Google Analytics bringen? Die Downloads kann es sicherlich nicht zählen!
 
Das kann es schon.
Dazu muss beim Downloadklick einfach nur eine JS-Funktion zusammen mit dem Speichernamen ausgeführt werden, wodurch es gezählt wird.
 
Zählt dann aber nur die Klicks auf den Link und nicht die wirklichen Downloads (Stichwort: Hotlinking).
 
aber nun mal ehrlich 1500 Zeilen pro Monat für eine Statistik ist nun aber nicht so die Welt.. also mach es doch einfach so wie du es am Anfang geplant hast..
 
1500 pro Monat ist sogar sehr sehr wenig. OpenX (ein Ads-System) protokolliert wirklich jede Kleinigkeit und da kommt diese Menge in wenigen Stunden zusammen - womit aber auch wirklich jedes DBMS heutzutage locker zurechtkommen sollte. 1500 Zeilen pro Monat sind wirklich nicht der Rede wert. Erst recht nicht, wenn man monatlich daraus Zusammenfassungen erstellt und die zusammengefassten Einträge anschließend löscht (was OpenX übrigens genauso macht).

Also von der Menge her sehe ich da wirklich üüüberhaupt kein Problem. Wenn du das für viel hältst, dann haben sich die Datenbanken bei dir bis jetzt bestimmt immer gelangweilt, denn ausgelegt sind die Systeme für sehr viel größere Datenmengen.
 
Eine andere Möglichkeit wäre, dass du für jede Datei einen DB Eintrag hast und beim Download ein Feld Anzahl um eins erhöhst. Jeden Tag um 24h könntest du die Daten aus der DB doch per php Script als Cronjob die Daten in eine Datei schreiben lassen, die du auf den Server legst.
 
kannste auch ohne cronjob (falls das nich angeboten wird oderso) und timestamp machen.

Jede datei hat einen eintrag in einer DB, inklusive den feldern:

Anzahl Downloads

und das feld

last_download

Wenn dann jmd was runterlädt kontrollierst du einfach ob das datum von last_download dem heutigem tag entspricht, wenn nein gibts nen update auf anzahl_downloads=1 und last_download = now().
Entspricht last_download dem heutigem tag gibts nur nen anzahl_downloads+1.

Is wohl mti cron einfache r aber die möglichkeiten hat ja nich jeder.

Oder wenn du es noch genauer machst, dann machste noch eine tabelle wo steht welche ip zu welcher uhrzeit was gedownloadet hat, dann kann man das schön nachvollziehen, für statistik freaks ^^
 
Zuletzt bearbeitet:
Zurück
Oben