PHP-Script: Bildabruf auf dem Webspace zählen

Guten Morgen zusammen,

folgendes Problem: ich möchte gerne eine Statistik der aufgerufenen Bilder auf meinem Webspace erstellen. Dabei dachte ich an ein PHP-Script, welches entweder separat nur für einen bestimmten Ordner gedacht ist oder sowas wie phpinfo, was man einfach ins Root-Verzeichnis legt und beim Aufruf direkt sehen kann, welche Bilder in welchem Ordner wie oft vom Server abgerufen wurden. Es sollen keine “Downloads” gezählt werden, sondern nur der Abruf der Bilder, wenn man z.B. die Webseite öffnet oder nen Newsletter öffnet. Hat da jemand vielleicht was fertiges oder einen Tip wie man da vorgehen muß?
Schön wäre es wenn es da was fertiges geben würde. Es würde auch reichen wenn man generell alle Aufrufe der Dateien zählen könnte.

Kann da jemand helfen?

Ob es da was fertiges gibt, weiß ich nicht. Hatte ich jetzt auch keine Lust nach zu suchen.

Aber das is recht einfach zu basteln.
Du leitest per htaccess jeden Aufruf auf ein Bild auf eine PHP-Datei um, die dir anhand des Dateinamens irgendwo einen Counter hochzählt und sich anschließend das Bild ausliest und unter einem passenden Header ausgibt.

Zu htaccess und dem Senden von Headern mit PHP findet man genug bei Google.

Gruß, Markus

Hallo,

leider kann ich sowas nicht mal eben selbst programmieren. Dafür reichen meine Kenntnisse noch nicht aus. Es soll eine Statistik sein, wo aufgeführt wird, welche Grafik wie oft vom Server abgerufen wurde. Habe inzwischen mehrere WebStatistiken ausprobiert aber keine bietet mir dieses Feature. Da wo die Webseite gehostet wird, wird das leider auch nicht mit angeboten. Müßte auf jeden Fall ein tool sein, welches ich auf dem Server installieren kann.

Hab jetzt schon gesucht wie so ein Irrer aber ich finde nichts passendes. Hat jemand so ein Tool oder kann jemand etwas gutes empfehlen?

Hallo,

inzwischen habe ich folgendes gefunden: <?php header("Content-type: image/png"); // wenn das Bild ein png ist diese Zeile verwenden // header("Content-Type: image/jpeg"); // wenn das Bild ein jpg ist diese Zeile verwenden $im = imagecreatefrompng("bild.png"); imagepng($im); //wird ein zuvor mit imagecreate() erzeugtes Bild (im) im PNG-Format an den Browser gesendet imagedestroy($im); //löscht den Speicher, welcher durch das Bild (im) belegt wurde ?> Quelle: http://www.php-resource.de/forum/php-developer-forum/68388-bild-grafik-aufrufe-loggen-zaehlen-auswerten.html

allerdings kann ich damit nicht allzuviel anfangen. Ist es das was ich suche bzw. kann mir da jemand behilflich sein bitte?

Das ist ein schlechtes Skript, welches unnötig Rechenleistung
kostet. Das solltest du gleich vergessen.

Die Idee wäre eher, die betreffenden Dateien in ein Verzeichnis
zu stecken, welches mit .htaccess gesperrt ist.
Dort könntest du auch Textdateien mit ähnlichem Namen
(zusätzlicher Endung) unterbringen, in denen dann die Zahl der
Zugriffe steht.

In dem zugänglichen Verzeichnis pappst du dann ein PHP-Skript,
an welchen der Name der Datei als GET-Parameter übergeben
wird, etwa so: Bildausgabe.php?b=Bildname&e=jpg
also Parameter b für den Namen und e für die Endung
(letzteres ist redundant, wenn du nur ein Format hast).

In dem Skript werden die GET-Parameter dann eingelesen,
der header ausgegeben, z.B.:
header(“Content-Type: image/jpeg”);
dann wird per readfile die Datei ausgegeben.
Bei readfile wird das Bild nicht neu erzeugt sondern einfach nur
ausgegeben, belastet den server also nicht mehr als ein direkter
Aufruf der Datei.
Und dann wird noch der Zähler um eins hochgesetzt, bzw
aufwendigere Statistik bearbeitet (kann auch vor der Ausgabe
erfolgen).

Ein ähnliches Skript habe ich, allerdings mehr zu dem Zwecke,
Aufrufe nur von der eigenen Seite aus zu ermöglichen - dazu
wird dann noch ein verschlüsselter Zeitparameter verwendet.
Ist insgesamt recht einfach zu machen, wenngleich sich mein
Skript jetzt nicht direkt für deine Anwendung eignet, das
protokolliert nur Fehler.

Hallo,

danke für die recht ausführliche Auskunft aber um das umzusetzen müßte ich das selber programmieren können. Bisher habe ich meine Scripts immer aus verschiedenen SChnipsel zusammen gebastelt oder es gab schon was fertiges. Generell hatte ich kurzzeitig einen Lösungsansatz gefunden indem ich einfach einen Counter implementiert hatte, wo ich dann Angaben machen konnte aber da das in einem HTML-Newsletter integriert werden muß, wird von dem Mailing-System jede Art von Script direkt entfernt. Deswegen brauche ich eine Lösung, welche die Aufrufe von Bildern auf dem Server oder in dem entsprechenden Ordner mitloggt und dann entsprechend anzeigt. Dachte das wäre was einfaches bzw. etwas was schonmal jemand gebraucht hätte aber scheinbar wohl doch nicht.

Mal ganz vorsichtig anfragen: Was fertiges irgendwo im Netz zufällig mal gefunden was vielleicht anpassbar wäre?

Hallo nochmal,

auf der Suche nach einer Lösung bin ich inzwischen auf den sogenannten Web-Bug gestossen. http://www.hennweb.de/index.php?view=items&cid=14%3Acode-schnipsel&id=46%3Aemail-lesebestaetigung-unbemerkt-erhalten-web-bug&option=com_quickfaq&Itemid=113

Mir geht es darum herauszufinden, ob ein HTML-Newsletter auch tatsächlich geöffnet wird und da ich über meinen Server keinerlei Infos bekomme bezüglich eines Bildabrufes, habe ich gedacht das wäre vielleicht eine Alternative. Eine Lesebstätigung. So weiss ich zumindest das die eMail geöffnet worden ist bzw. angekommen.

Nun meine Frage dazu: Ist das denn legal oder sollte ich das lieber lassen? Welche Alternative hätte ich denn sonst?

Keine Ahnung, ob das legal ist.
Auf jeden Fall bringt dir das nicht viel, wenn der Empfänger die HTML-Ansicht abgeschaltet hat (aus genau diesem Grund der versteckten Bestätigung habe ich das nicht an)

Ich finde die Idee von hoffmann gut und hab es mal ansatzweise umgesetzt:

<?php
//Bilder per php ausgeben und zählen
$pic = $_GET["pic"];
if($pic){
  header("Content-Type: image/jpeg");
  $bytes = readfile($pic);
  //zählung
  $dateiname="count.txt";
  if (file_exists($dateiname)){
    $datei = fopen($dateiname, 'r+'); 
    $counterstand = fgets($datei, 10); 
    rewind($datei);			
    fwrite($datei, ++$counterstand);	
    fclose($datei);
    }
  else {
    //Datei neu erstellen
    $datei = fopen($dateiname, 'w');
    fwrite($datei, "1");
    fclose($datei);
    }  
  }
else echo "Sorry. Need ?pic=Bildname";  
?>

Die einzelnen Bilder werden hier nicht unterschieden, dafür muß noch etwas mehr getan werden. :slight_smile:

Hallo zusammen,

@pit: ich habe mal versucht deinen Lösungsansatz umzusetzen aber es funktioniert nicht wirklich. Bekomme immer die Fehlermeldung: Sorry. Need ?pic=Bildname.

Ich habe pic in dem folgenden Code in bild.jpg geändert: //Bilder per php ausgeben und zählen $pic = $_GET["bild.jpg"];
Dann habe ich das Script per Directaufruf über den Browser aufgerufen. Alternativ habe ich dann noch das Bild an die URL angehangen. Aber es wird nichts gezählt obwohl ich das Bild per Browser aufgerufen habe. Habe ich da was falsch verstanden?

Natürlich, weil $_GET[‘pic’] nicht existiert.

[quote]Ich habe pic in dem folgenden Code in bild.jpg geändert: //Bilder per php ausgeben und zählen $pic = $_GET["bild.jpg"];[/quote]
Tja, das ist der Fehler.

Wenn du das Script mit scriptname.php?pic=… aufrufst, dann muss die Abfrage natürlich auch auf $_GET[‘pic’] lauten.

Wieso änderst du denn überhaupt Sachen an Stellen, die du nicht verstehst …?

Hallo,

@chrisb:

[quote]Wieso änderst du denn überhaupt Sachen an Stellen, die du nicht verstehst …?[/quote] ja da gebe ich dir Recht. Ich habe das tatsächlich nicht verstanden, da PHP nach wie vor immer noch nicht so richtig zu meinen Stärken gehört. Ich habe das so verstanden, das pic durch den Bildnamen welches man zählen möchte ersetzen muß. War wohl definitiv falsch interpretiert.

Ok ich habe das wieder in den Originalzustand gebracht. Jetzt habe ich die URL zum Bild in den Browser angegeben welche folgendermaßen aussieht: http://www.meinserver.de/scriptname.php?pic=bild.jpg
Wenn ich mir dann die count.txt anschaue, dann wird dort aber nichts reingeschrieben vom Script. Das Bild wird problemlos angezeigt aber es scheint so als wenn das Script den Aufruf des Bildes nicht zählen würde bzw. nicht in die count.txt schreiben würde. Ich habe der count.txt die Berechtigung 777 gegeben. Habe ich da erneut was falsch verstanden?

Gibt es auch einen Link zum Script?

Nein, das script hab ich auf die Schnelle local unter XAMPP getestet.
Die Datei count.txt wird beim ersten Start vom script selbst erzeugt und dann funktioniert das auch. Existiert aber z.B. schon eine leere Datei count.txt, funktioniert das so nicht. An der Stelle ist eh noch viel zu tun, damit aus dem Ansatz was sinnvolles wird. Wie gesagt, sollte ein Ansatz sein und kein fix und fertiges Script.

Pit

Meinte eher wo er das oben hat :slight_smile:

Hallo zusammen,

ja jetzt geht es. Ich hatte tatsächlich die count.txt selber erstellt und nicht vom Script erstellen lassen. Das ist schonmal ein guter Ansatz wie ich finde. Jetzt würden nur noch ein paar weitere Angaben in der count.txt fehlen, damit man das auch auswerten kann. Ich dachte da an den Pfadnamen, Datum, Uhrzeit. Das ganze wäre auch noch sinnvoll, wenn man da die IP mit einbringen könnte. So wie ein Counter, das die nur einmal gezählt wird. Und eine Art Übersicht für den Direkt-Aufruf bzw. eine Statistik z.B. Balkendiagramm oder ähnliches als HTML-Ausgabe. Ja ich weiss das wären die Feinheiten. Kann ich denn jemanden motivieren so etwas fertig zu stellen?

Wie gesagt selber programmieren bekomme ich leider nicht so wirklich hin. Bekomme es gerade so eben hin fertige Scripte ein wenig anzupassen aber komplett selber schreiben keine Chance.

Tja, ziemlich viel Arbeit… also habe da eine nette Diagrammfunktion für PHP gefunden die ich schonmal benutzt habe, die erstellt ein Bild. Weiß nicht ob du das willst. Trotzdem, hier der Link: drweb.de/magazin/diagramme-m … erstellen/

Mfg :wink2:

Hi,
würds über mysql datenbank machen nicht über ne txt datei :wink:

lg flo