[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • Downloadmodul mit Counter-Funktion
Seite 1 von 1

Downloadmodul mit Counter-Funktion

Verfasst: 2. Mär 2015, 17:40
von karlnappmitdenasskap
Hi,

altes Thema aktuell: Gibt es ein empfehlenswertes Modul/AddOn, welches zählt, wie oft eine Datei heruntergeladen wurde? Wie ich im Forum recherchiert habe, gab es so etwas für ältere REDAXO-Versionen mal HIER.

Ich habe mir jetzt selbst etwas gebastelt auf Basis des Downloadmodul Medialist r3.0:

Ich habe hier beim generierten Download-Link eine Zähler-PHP (download.php) dazwischen geschaltet, die zählt u. schreibt.

Ursprünglicher Code (Ausgabe):

Code: Alles auswählen

<div class="list_content"><a href=<? echo $REX[HTDOCS_PATH]."files/".$value; ?> target="_blank"><img src="<? echo $parsed_icon ?>" alt="Download"> </a> <? echo $value ?> - <?php echo Dateigroesse ($REX[HTDOCS_PATH]."files/".$value); ?> </div>
<? If ($fileDescription != "") { ?> <div class="list_content3"><? echo $fileDescription; ?></div> <? }  } ?>
Geänderter Code(Ausgabe):

Code: Alles auswählen

<div class="list_content"><a href=<? echo $REX[HTDOCS_PATH].'download.php?to='.$REX[SERVER].'files/'.$value; ?> target="_blank"><img src="<? echo $parsed_icon ?>" alt="Download"></a> <a href=<? echo $REX[HTDOCS_PATH].'download.php?to='.$REX[SERVER].'files/'.$value; ?> target="_blank"><? echo $value ?></a><br /> Dateigröße: <?php echo Dateigroesse ($REX[HTDOCS_PATH]."files/".$value); ?></div>
<br /><? }  } ?>
Die download.php sieht, wie folgt aus:

Code: Alles auswählen

 <?php

// verzeichnis in dem die log-datei liegt, ohne schrägstriche
$dir      = "files";

// name der log-datei
$db       = "downloadzaehler.db";

$newlink  = 1;
$url      = "";
$file     = $dir."/".$db;


// hier wird versucht das verzeichnis zur zähler-datei zu erstellen. das könnte man aber auch per hand...
if (!file_exists($dir)){    
    mkdir($dir) or die ("can't create directory!");
}

// den zu zählenden link aus der GET-übergabe fischen...
$url = $_GET['to'];


// die auszuwertende url darf nicht leer sein und muss aus mindestens vier zeichen bestehen
if ((isset($url)) && (!empty($url)) && (strlen($url)>4)){    
      
      // falls die übergebene url nicht mit http:// oder https:// oder ftp:// beginnt wird automatisch ein http:// davorgesetzt
      if (!preg_match("(^(http://|https://|ftp://))i", $url)){
          $url = "http://".$url;
      }                                       
      
      // die zähler-datei wird geöffnet und gesperrt - zwei gleichzeitige zugriffe würden die sache nur durcheinanderbringen
      $getstats = fopen($file, "r+");
      flock($getstats, LOCK_EX);
      
      // die zähler-datei wird eingelesen...
      $filecontent = fread($getstats, filesize($file));
      $fileline = explode("\n", $filecontent);
      $lines = count($fileline)-1;
      rewind($getstats);
      
       // in jeder zeile ist der auszuwertende link und die klicksumme vermerkt. das wird hier getrennt und zeilenweise abgearbeitet
      for ($n = 0; $n < $lines; $n++){          
          $entry = explode(" $ ", $fileline[$n]);

          // falls der eintrag der aktuellen zeile mit der übergebenen url übereinstimmt wird der entsprechende klick-zähler erhöht...
          if ($entry[0] == $url){
                $entry[1]++;
          } else {
                // ...andernfalls wird ein script-interner zähler zur ermittlung neuer links verwendet
                $newlink++;
          }
          $writeline = "$entry[0] \$ $entry[1]\n";
          fwrite($getstats, $writeline);                      
      }

      // falls bei allen einträgen keine übereinstimmung auftrat handelt es sich wohl um einen neuen link - dann wird dieser eben angehängt
      if ($newlink > $lines){
          $newline = "$url \$ 1\n";
          fwrite($getstats, $newline);
      }

      // abschließend geben wir die zähler-datei wieder frei...
      flock($getstats, LOCK_UN);
      fclose($getstats);
      
      // ... und lotsen den besucher zur gewünschten ressource
      header("Location:" .$url);      
      exit;       

// und für den fall dass wirklich alles schiefgeht:
} else {
    header("Location: http://deinedomain.tld");
}
?> 
Die Downloads werden dann in eine beliebige Statistik-Datei (hier: downloadzaehler.db) geschrieben.

Dann gibt's noch ein kleines Modul, um die Download-Statistik auszugeben (Ausgabe):

Code: Alles auswählen

<div id="download-statistik" style="font-size:8px;">
<?php
echo '<h2>Download-Statistik:</h2>';
$zeilen = file ('./files/downloadzaehler.db');
foreach ($zeilen as $zeile) {
    echo $zeile.'<br />';
}
?>
</div>
Sprich: Das Modul arbeitet mit einer Datenbank unabhängigen Datei.
Meine Lösung funktioniert soweit auch einwandfrei. Wer es sich mal anschauen will, kann sie hier downloaden
Frage: Wäre es nicht eleganter, sowas als AddOn anzulegen und dann die Ergebnisse in die DB zu speichern?
Weitere Frage: Gibt es ggf. bereits eine (elegantere) AddOn-Lösung, um Downloads zu countern?!

Re: Downloadmodul mit Counter-Funktion

Verfasst: 3. Mär 2015, 03:15
von Ingo
karlnappmitdenasskap hat geschrieben:Frage: Wäre es nicht eleganter...
Eleganter wärs das per Google Analytics oder Piwik zu machen...