Jan K.: Download Counter - welche PHP Funktion?

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

  1. 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ß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
  2. 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

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  3. http://www.useful-scripts.biz/usefulcounter/

    Gruß

    Martin

    1. 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

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  4. 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

  5. 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>
    
  6. ich möchte gerne zählen wie oft eine Datei heruntergeladen wurde

    Download Log

    1. 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

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  7. 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

    --
    Zend Certified Engineer
    1. 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

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. 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

        --
        Zend Certified Engineer
        1. 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

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. 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

            --
            Zend Certified Engineer
            1. 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

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. 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

                --
                Zend Certified Engineer
                1. 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

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de