Counter zählt falsch

Ich hab jetzt die Ausgabe nicht direkt gemacht (also header('Content-Type: image/png')), sondern das Bild gespeichert und dann mit echo() ausgegeben, dann funktionierts auch... Im Folgenden mal der Code:

PHP:
<?php
ob_start(); # Ausgabepuffer aktivieren
error_reporting(E_ALL); # Alle Meldungen anzeigen


$filename = 'counter.txt'; # Counterdatei

# Wenn Datei nicht existiert, neu anlegen und Counterstand auf 0 setzen
if(!file_exists($filename)){ 
	$fp = fopen($filename, 'w+');
	$i	= 0; }
# Datei existiert, also Counterstand auslesen
else{
  	$fp = fopen($filename, 'r');
  	$i	= fread($fp, filesize($filename)); }

fclose($fp); # Datei schließen
$i += 1; # Counterstand um eins erhöhen

#Bild erstellen	
$cIMG = imageCreate (500, 20);
$white = imageColorAllocate ($cIMG, 0, 0, 0);
$green = imageColorAllocate ($cIMG, 50,148,0);
imageColorTransparent($cIMG,$white);
imageFilledRectangle($cIMG,20,20,280,130,$white);
imageString ($cIMG, 5, 2, 2, 'Diese Seite wurde schon '.$i.' mal aufgerufen!', $green);
imagePNG($cIMG, 'counter.png');	

echo '<img src="counter.png" />';

$fp = fopen($filename , 'w'); # Datei zum schreiben öffnen und Inhalt löschen
flock($fp, LOCK_EX); 
fwrite($fp, $i); # Neuen Counterstand eintragen
flock($fp, LOCK_UN);
fclose($fp); # Datei schließen

ob_end_flush(); # Ausgabepuffer an Browser senden
?>
 
Zuletzt bearbeitet:
Also so funktioniert es bei mir auch, nur möchte ich die counter.php direkt als Grafik einbinden (auf einer anderen Seite).
Komisch...

EDIT: So, auf Basis eines Download Scripts hier die unelegante Lösung:

PHP:
<?php

/////////////////// Counter ///////////////////
$filename = 'counter.txt';

if(!file_exists($filename)){
    $fp = fopen($filename, 'w+');
    $i    = 0; }
else{
      $fp = fopen($filename, 'r');
      $i    = fread($fp, filesize($filename)); }

fclose($fp);

if($i == '')
    $i = 0;
else
    $i += 1;

$mein_bild = ImageCreate (500, 20);
$white = ImageColorAllocate ($mein_bild, 0, 0, 0);
$gruen = ImageColorAllocate ($mein_bild, 50,148,0);
imageColorTransparent($mein_bild,$white);
imageFilledRectangle($mein_bild,20,20,280,130,$white);
imageString ($mein_bild, 5, 2, 2, "Diese Seite wurde schon ".$i." mal aufgerufen!", $gruen);
imagegif($mein_bild, 'counter.gif');




$bild = "counter.gif";
 if ((file_exists($bild)) && (is_readable($bild)))

         {

              $dlfile=fopen($bild,'r');

        }

   else

       {

         die('<p>Datei konnte nicht geöffnet werden.\n');

        }

      header('Content-Type: image/gif');

      header('Content-Disposition: attachment; filename="'.$bild.'"');

    //  header('Content-Length: '.filesize($bild));

      while (!feof($dlfile))

          {

              $bytes=1024;

              if ($kbs>0)

                  {

                      $bytes*=$kbs;

                  }

              echo fread($dlfile,$bytes);

              flush();

              if ((!feof($dlfile)) && ($kbs>0))

                  {

                      sleep(1);

                  }

          }

      fclose($dlfile);



$fp = fopen($filename , 'w');
flock($fp, LOCK_EX);
fwrite($fp, $i);
flock($fp, LOCK_UN);
fclose($fp);


?>

Eingebunden werden kann es einfach per <img src="counter.php">.
Zuerst wird die Grafik auf Platte geschrieben, dann geöffnet und an den Empfänger geschickt. Wird das Script direkt aufgerufen gibt es die Datei zum Download an.

Falls jemand noch eine elegantere Lösung hat bitte melden!

Greets
 
Zuletzt bearbeitet:
So, die idiotischste Lösung... Weil er sich ja immer um 2 erhöht, lasse ich $i einfach nur um 0,5 erhöhen und somit im Endeffekt um 1... Haha :D

PHP:
<?php
ob_start(); # Ausgabepuffer aktivieren
error_reporting(E_ALL); # Alle Meldungen anzeigen
header('Content-Type: image/png');

$filename = 'counter.txt'; # Counterdatei

# Wenn Datei nicht existiert, neu anlegen und Counterstand auf 0 setzen
if(!file_exists($filename)){ 
	$fp = fopen($filename, 'w+');
	$i	= 0; }
# Datei existiert, also Counterstand auslesen
else{
  	$fp = fopen($filename, 'r');
  	$i	= fread($fp, filesize($filename)); }

fclose($fp); # Datei schließen
#Bild erstellen	
$cIMG = imageCreate (500, 20);
$white = imageColorAllocate ($cIMG, 0, 0, 0);
$green = imageColorAllocate ($cIMG, 50,148,0);
imageColorTransparent($cIMG,$white);
imageFilledRectangle($cIMG,20,20,280,130,$white);
imageString ($cIMG, 5, 2, 2, 'Diese Seite wurde schon '.ceil($i).' mal aufgerufen!', $green);
imagePNG($cIMG);

$i += 0.5; # Counterstand um 0.5 erhöhen (also im Endeffekt um 1, warum auch immer...)

$fp = fopen($filename , 'w'); # Datei zum schreiben öffnen und Inhalt löschen
flock($fp, LOCK_EX); 
fwrite($fp, $i); # Neuen Counterstand eintragen
flock($fp, LOCK_UN);
fclose($fp); # Datei schließen

ob_end_flush(); # Ausgabepuffer an Browser senden
?>
 
Zuletzt bearbeitet:
Nur noch eine Sache. Mir ist aufgefallen, dass wenn man ganz schnell den Reload-Button drückt, sich der Counterstand manchmal nur um 0.5 erhöht, also pack mal $i in imageString in die ceil()-Funktion. Round() oder floor() geht auch. Dann hast du immer glatte Werte.

P.s: Markiere das Thema bitte noch als "Erledigt". Danke!
 
Zurück