Download Counter - welche PHP Funktion?
Jan K.
- php
0 frankx0 EKKi0 Martin aus Wien0 Tom
0 Matthias1 Tom0 mike780 Tom
4 Christoph Jeschke- webserver
0 Tom
Hallo zusammen,
ich möchte gerne zählen wie oft eine Datei heruntergeladen wurde, aber ich weiß nicht welche PHP Funktion (wenn es denn eine gibt) dafür gedacht ist.
Kann mir jemand einen Tipp geben?
Gruß,
Jan
Hellihello
ich möchte gerne zählen wie oft eine Datei heruntergeladen wurde, aber ich weiß nicht welche PHP Funktion (wenn es denn eine gibt) dafür gedacht ist.
welche Datei denn? Wenn es keine PHP-Datei ist, musst du unter umständen die Ausgabe der Datei durch PHP durchschleifen (inklusive der entsprechenden Headersetzung) um mitzählen zu können.
Zählen tust du so ungefähr mit
if (file_exists("my_counter.txt")) {
$counter = file_get_content("my_counter.txt");
$counter++;
file_put_contents("my_counter.txt", $counter);
} else {
$counter = 1;
file_put_contents("my_counter.txt", $counter);
}
ungetestet.
Dank und Gruß,
Mahlzeit Jan K.,
ich möchte gerne zählen wie oft eine Datei heruntergeladen wurde, aber ich weiß nicht welche PHP Funktion (wenn es denn eine gibt) dafür gedacht ist.
Es gibt keine "PHP Funktion" für so etwas. Du könntest folgendermaßen vorgehen:
Link auf eine PHP-Datei, die als URL-Parameter die gewünschte Datei übergeben bekommt
PHP-Datei zählt irgendeinen Zähler (Datenbank, Textdatei) um 1 hoch
PHP-Datei öffnet die gewünschte Datei (die sinnvollerweise außerhalb des DOCUMENT_ROOT liegt), setzt den passenden Content-Type im Header und gibt die Datei an den Browser aus
MfG,
EKKi
http://www.useful-scripts.biz/usefulcounter/
Gruß
Martin
Hello Martin,
http://www.useful-scripts.biz/usefulcounter/
Bist Du wirklich sicher, dass das Script nützlich ist?
siehe http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo Jan!
PHP ist zwar gar nicht meine Baustelle, daher kann ich dir nicht mit code dienen.
Ich gehe davon aus, dass du eine beliebige Datei meinst - also z.B. eine PDF die du anbietest.
Du könntest dir eine PHP-Seite basteln der du den Dateinamen übergibst um dann den Dateiinhalt an den Browser zu senden. Dann kannst du einfach irgendwo, z.B. in einer Datenbank, mitzählen.
In ASP geht´s z.B. mit adodb.stream zum ein- und response.binarywrite zum ausgeben, in PHP gibt es sicher etwas ähnliches.
Eine andere Möglichkeit wäre "einfach" die Log-Datei auszuwerten. Nach deinem Dateinamen suchen und die Anzahl der Einträge wäre dann auch die Anzahl der Downloads.
Vielleicht hilft dir das ja weiter.
Gruß
Matthias
Hello Jan,
ich möchte gerne zählen wie oft eine Datei heruntergeladen wurde, aber ich weiß nicht welche PHP Funktion (wenn es denn eine gibt) dafür gedacht ist.
PHP kann schon eine ganze Menge, aber eine solche fertige Funktion ist mit nicht bekannt.
Ich sage einfach mal: die gibt es noch nicht.
Du kannst das Problem aber zerlegen in teilprobleme und dann mit den vorhandenen Funktionen von PHP zum Ziel kommen.
1. Überlegung:
Die herunterzuladenen Datei sollte nicht direkt per HTTP erreichbar sein,
damit niemand den Zähler umgehen kann.
2. Überlegung
Es könnten mehrere User ziemlich gleichzeitig Dateien herunterladen, da wäre es möglich
dass der Zähler von mehreren Usern gleichzeitig bedient werden muss. Er muss darauf
vorbereitet sein, damit es kein Durcheinander gibt.
-> den Fachartikel zum Thema Filelocking lesen.
http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/
Wie liefert man nun ein File aus, dass nicht in der Dokument Root liegt, also nicht direkt per HTTP erreichbar ist?
Wenn der Server eine Ressource per HTTP ausliefert, sendet er zuerst einen HTPP-Header
mit dem MIME-Type, dem Namen, der Größe und sonstigen Informationen zur Datei.
Wirklich notwendig für den Browser ist der MIME-Type.
Als nächstes sendet der Browser dann eine "Leerzeile" umd die Header vom Inhalt zu trennen
Dann folgt der Inhalt der ressource, also das, was der Browser ggf. als "Quelltext"
empfinden würde. Bei einem Bild ist es z.B. die Bilddatei.
Du erreichst das in PHP z.B. für ein GIF-Image durch den Code:
~~~php
header('Content-Type: image/gif');
readfile($pfad_zur_bilddatei);
exit;
Beim Zähler wird es dann schon etwas komplizierter.
Gehen wir davon aus, dass es schon eine Zählerdatei gibt, die am Anfang noch leer ist.
Du kannst sie mit touch($path\_to\_counter\_file) erzeugen.
Da Du ja im Artikel über das Sperren von Datein gelesen hast, dass man den gesamten Änderungsprozess schützen muss, ergibt sich folgender Code:
[codelang=php]
## als Binärfile zum Lesen und Schreiben öffen
$counter\_file\_handle = fopen($path\_to\_counter\_file, 'rb+');
## Erfolg beim Öffnen?
if ($counter\_file\_handle)
{
## Datei sperren zum Zwecke der Veränderung
flock($counter\_file\_handle, LOCK\_EX);
$counter = fread($counter\_file\_handle, filesize($path\_to\_counter\_file)); ## Daten holen
$counter = intval($counter); ## Daten in Integer umwandeln, falls versehentlich andere
$counter++; ## Zeichen hinzugekommen sind und um eins erhöhen
fseek($counter\_file\_handle, 0, SEEK\_SET); ## Dateizeiger an den Anfang zurückstellen
fwrite($counter\_file\_handle,$counter); ## Neuen Wert in die Datei schreiben
fclose($counter\_file\_handle); ## Counterfile schließen und freigeben.
## Wenn der neue Inhalt ggf. kürzer werden kännte als der alte, MUSS die Datei noch
## auf die neue Länge gekürzt werden vor dem Schließen -> ftruncate();
}
Mit diesen beiden Bausteinen solltest Du zum Ziel kommen.
Leider kann ich <http://php.net> zur Zeit nicht ereichen von hier aus, sonst hätte ich Dir noch die passenden Seiten verlinkt :-|
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
ich möchte gerne zählen wie oft eine Datei heruntergeladen wurde
Hello,
ich möchte gerne zählen wie oft eine Datei heruntergeladen wurde
Download Log
Ich kann in diesem Script nirgends erkennen, dass konkurrierender Betrieb berücksichtigt wurde.
Wenn auch niemand anderes die passenden Stellen findet, wäre das Script wertlos.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Guten Tag,
Kann mir jemand einen Tipp geben?
Jeder Request auf eine Ressource wird in mindestens einem Logfile deines Webservers gespeichert. Es ist nicht nötig, diese Information mehrmals zu erheben.
Lass dir die Logfiles geben und werte diese entweder selbst aus, z.B. mit einem selbstgeschriebenen Skript, wenn du kein grep verwenden kannst / möchtest, oder einer fertigen Lösung wie awstat oder webalizer.
Gruß
Christoph Jeschke
Hello,
Jeder Request auf eine Ressource wird in mindestens einem Logfile deines Webservers gespeichert.
Wo steht das?
Wer hat das so festgelegt?
Welche Daten kann ich da erkennen?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Guten Tag,
Wo steht das?
Wer hat das so festgelegt?
Welche Daten kann ich da erkennen?
Ich schätze dein Wissen darüber als vorhanden ein. Wenn du mir etwas mitteilen möchtest, freue ich mich über eine explizite Botschaft.
Sollte ich mich irren, kannst du das hier schreiben. Ich erkläre dann gerne.
Gruß
Christoph Jeschke
Hello,
Wo steht das?
Wer hat das so festgelegt?
Welche Daten kann ich da erkennen?Ich schätze dein Wissen darüber als vorhanden ein. Wenn du mir etwas mitteilen möchtest, freue ich mich über eine explizite Botschaft.
Sollte ich mich irren, kannst du das hier schreiben. Ich erkläre dann gerne.
Erklär mal bitte lieber. :-)
Also, wieso kann ich mich darauf verlassen, dass jeder Request an meinen Webserber registiert wird mit allen erfoderlichen Daten und dass ich später auch auf dieses Log zugreifen kann?
Wo sagen mit awstat oder webalizer später, wer den Download angefordert hat, was mit einem separaten Downloadscript bei passender Erweiterung ohne weiteres realisierbar wäre?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Guten Tag,
Also, wieso kann ich mich darauf verlassen, dass jeder Request an meinen
Webserber registiert wird mit allen erfoderlichen Daten und dass ich
später auch auf dieses Log zugreifen kann?
Entweder, man hat den Server selbst aufgesetzt, dann sollte man es auch wissen, oder man fragt denjenigen, der den Server aufgesetzt hat. Diese Information bestimmt das weitere Vorgehen: Üblicherweise gibt es einen Access-Log, der jeden Request an den Webserver aufzeichnet. Gibt es diesen nicht und man kann auch nicht auf diese Information verzichten, mag es sinnvoll sein, einen eigenen Log schreiben zu lassen. Gleiches gilt auch, wenn man sich durch Wahl einer bestimmten Vorgehensweise selbst ein Bein gestellt hat, z.B. wenn man ein Downloadskript verwendet, welches verschiedene Dateien lesen und ausgeben kann und nicht eindeutig adressierbar ist.
Aber das hat der OP so nicht erfragt.
Wo sagen mit awstat oder webalizer später, wer den Download angefordert
hat, was mit einem separaten Downloadscript bei passender Erweiterung
ohne weiteres realisierbar wäre?
Diese Anforderungen hat der OP nicht gestellt. Davon abgesehen sind die Fragen nach "Wer" und "Wo" ohne Kontext nicht beantwortbar. "Wo" in Stenkelfeld? Oder "wo" innerhalb eines Klickpfades auf einer Website?
Gruß
Christoph Jeschke
Hello,
Diese Anforderungen hat der OP nicht gestellt.
Entschuldige bitte. Mitdenken ist hier nicht verboten!
Oder habe ich etwas verpasst?
Wenn dem OP meine Ideen nicht passen, kann er sich immer noch selber melden.
Oder hast Du etwa nur einen Teaser unter einem falschen Namen losgelassen?
Dann solltest Du das richtig stellen.
Ich gebe ja zu, dass ich im Forum in den letzten 10 Jahren eine Menge gelernt habe.
Ohne dieses Forum wüßte ich heute vielleicht nicht einmal, dass es nach SuSE noch was anderes gab :-))
Aber meine Ideen trage ich immer noch vor, auch wenn ein OP nicht direkt danach fragt.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Guten Tag,
Diese Anforderungen hat der OP nicht gestellt.
Entschuldige bitte. Mitdenken ist hier nicht verboten!
Oder habe ich etwas verpasst?
Wenn dem OP meine Ideen nicht passen, kann er sich immer noch selber
melden.
Oder hast Du etwa nur einen Teaser unter einem falschen Namen losgelassen?
Dann solltest Du das richtig stellen.
Mir ist nicht klar, wie du zu diesen Vermutungen kommst. Sie sind unwahr. Du solltest grundsätzlich vorsichtig mit solchen Anschuldigungen sein, vor allem dann, wenn du keine Beweise haben kannst.
Ich gebe ja zu, dass ich im Forum in den letzten 10 Jahren eine Menge
gelernt habe.
Ohne dieses Forum wüßte ich heute vielleicht nicht einmal, dass es nach
SuSE noch was anderes gab :-))Aber meine Ideen trage ich immer noch vor, auch wenn ein OP nicht direkt
danach fragt.
Offenbar fühlst du dich angegriffen - warum auch immer. Ich bin an keinen auf emotionaler Basis geführten Diskussionen interessiert. Daher ist diese, mit dir im Rahmen dieses Threads geführte, für mich beendet.
Gruß
Christoph Jeschke
Hello Christoph,
Mir ist nicht klar, wie du zu diesen Vermutungen kommst. Sie sind unwahr. Du solltest grundsätzlich vorsichtig mit solchen Anschuldigungen sein, vor allem dann, wenn du keine Beweise haben kannst.
Was für Anschuldigungen? Ist fragen schon wieder verbotren? Hei, was ist los?
Offenbar fühlst du dich angegriffen - warum auch immer.
Das gebe ich zurück :-)
Welches Dojo nehmen wir?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg