Tom: Download Counter - welche PHP Funktion?

Beitrag lesen

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>