mkrasselt1
Goto Top

Einfaches PHP Counter-Script gibt laufzeitüberschreitung aus ?

Warum sorgen einfache Aditionen bei meinem PHP-Script für Fehlermelungungen,
und eine schleife zum Dateiauslesen überschreitet die Laufzeit

Hallo Koleggen,
nun, wenn ich schreibe, muss mein Problem schon tiefer liegen.
Ich habe mir einen PHP-Besucherzähler gebaut, der einfach nur die Absolut
Besucher zählen soll, dazu gibt es eine .txt datei für Besucherzahl,
und eine für die besuchenden IP's.
Wiedererkannt werden besucher mittels Cookie.
eigentlich nichts komplitziertes und Rechenaufwändiges, aber mein Script
bricht iwie immer mit Laufzeitüberschreitung ab.
ich habe schon alles versuch und das Script sogar schon 7 mal Neugeschrieben, und wollte es schon aufgeben.

Vieleicht könnt ihr mir helfen

mkrasselt1

Hier jetzt die Fehlermeldungen und das Script:
Script---------
  
<html>
<head>
<title>Counter</title>
</head>
<body><?php
error_reporting(E_ALL);
if(!isset($_COOKIE['besucher'])){setcookie("besucher","0",time()+(3600*24));}  
if(isset($_COOKIE['besucher']) and $_COOKIE['besucher'] == 1){  
                                $count = fopen("./besucher.txt", "r");  
                                if($count){}
                                while(!feof($count)){
                                                      if(!isset($besucher)){
                                                      $besucher = fgets($count);
                                                                  }
                                                      }
                                fclose($count);
                                echo "$besucher";  
}
else{
setcookie("besucher","0",time()+(3600*24));  
$ip = $_SERVER['REMOTE_ADDR'];  
$found = false;
$iplog = fopen("./iplog.txt", "a");  
if($iplog){}
while(!feof($iplog)){
                      $ips = fgets($iplog);
                      $ips = substr($ips,0,-1);
                      if($ips == $ip){$found = true;}
                    }
if($found == false){ 
                    fwrite($iplog, $ip."\n");  
                    }
fclose($iplog);                    
$count = fopen("./besucher.txt", "w+");  
if($count){}
while(!feof($count)){
                      $besucher = fgets($count);
                    }
                fwrite($count, $besucher);
                fclose($count);
                echo "$besucher";  

}
?>
</body>
</html>
Fehlermeldung bei diesem Script-------------------
Warning: Cannot modify header information - headers already sent by (output started at E:\xampp\htdocs\counter.php:5) in E:\xampp\htdocs\counter.php on line 7

Warning: Cannot modify header information - headers already sent by (output started at E:\xampp\htdocs\counter.php:5) in E:\xampp\htdocs\counter.php on line 20

Fatal error: Maximum execution time of 60 seconds exceeded in E:\xampp\htdocs\counter.php on line 27

Content-ID: 134978

Url: https://administrator.de/forum/einfaches-php-counter-script-gibt-laufzeitueberschreitung-aus-134978.html

Ausgedruckt am: 23.12.2024 um 00:12 Uhr

thaenhusen
thaenhusen 02.02.2010 um 15:45:40 Uhr
Goto Top
Moin.

Das error_reporting(E_ALL); muss als erste Zeile, also vor irgendwelchen Ausgaben kommen.

Durch die Deine Schleiferei durch Dateien wird das vermutlich sehr langsam. Du solltest das mit einer
Datenbank (z.B. MySQL) machen und einen Timestamp aufnehmen und alles älter als ein Tag rausschmeissen.

Dann gucken, ob die IP noch vorhanden ist und wenn nicht sie hinzufügen und den letzten Wert für Counter dabei um eins erhöhen...

Dann haut das in akzeptabler Zeit hin.

HTH
MK
mkrasselt1
mkrasselt1 02.02.2010 um 15:54:29 Uhr
Goto Top
Danke,
wäre auch ne idee, aber ich möchte nicht von meinem datenbankserver abhängig sein.
Da ist mir die Smart variante mit den dateien lieber, zumal bei meine 10 besuchern im Jahr,
die datenbank nicht wirklich sinn machen würde.
Ich habe mal die e "weisung befolgt",
hier das Ergebnis: http://michaelshomepage.dnsalias.com/counter.php
Aber das wäre ja nicht das einzige Problem,
da ja in der einen zeile mit der fgets anweisung trotzdem probleme auftreten.
Danke schonmal im vorraus.
mkrasselt1
Arano
Arano 02.02.2010 um 16:58:47 Uhr
Goto Top
Sind geil solche Kommentare oder ?
Beschäftigen sich kein Stück mit dem gestelltem Problem, raten aber zu allem möglichem...
@thaenhusen: face-wink Nicht böse sein face-smile Jemanden auf (möglicherweise) bessere/schnellere oder was auch immer für Möglichkeiten hinzuweisen ist ja definitiv keine verkehrte Sache, im Gegenteil !
Aber man kann nie genau wissen warum der Gegenüber sich gerade für diesen Weg entschieden hat. Vielleicht bietet der Webspace keine Datenbank an oder man möchte auch einfach zuhause Weiterwerkeln ohne sich den DB-Server noch installieren zu müssen obwohl man keine Ahnung hat ect. pp.
Lernen kann man alles, das ist klar aber nicht alles auf einmal und so fängt man eben auch klein an, anstelle eines "riesigen" SQL-Servers einfach eine kleine Datei fertig aus und punkt.
Was ich eigentlich sagen wollte.
Drängt dem Hilfesuchenden nicht in eure Wege, __helft ihnen ihren eigenen Weg zu bestreiten__ und wenn ihr möchtet, erzählt ihnen von eurem Weg.
(Wow, ich bin begeistert von mir)

@mkrasselt1:
Das Problem ist der Modus in dem du die Datei öffnest !
__Zeile 24:__
24.$iplog = fopen("./iplog.txt", "a");  
So wird die Datei mit dem "Zeiger" am Ende der Datei geöffnet, so kann schon mal nichts mehr aus der Datei gelesen werden weil der Zeiger sich bereits am Ende der Datei befindet.
Dadurch (das weiss ich jetzt nicht genau) kommt es scheinbar mit feof() zu dem Problem das das Ende nicht erkannt wird. Ich vermute das es daran liegt weil die Datei zum lesen UND schreiben geöffnet wurde und es somit kein richtiges Ende der Datei gibt da diese gerade ohne Beschränkung erweitert / beschrieben werden kann.
Verwende anstelle von "a" das "r" aber vergiss nicht das du später noch etwas in die Datei schreiben möchtest, diese dann aber aktuelle nur zum lesen geöffnet ist !

Für das auslesen der "besucher.txt"-Datei schau dir mal file_get_contents() an.

Rücke den Text um eine bestimme anzahl ein z.B. 4 Leerzeichen, das ist sehr gebräuchlich, sieht einheitlicher und sauberer aus und ist zudem besser lesbar.


~Arano
dog
dog 02.02.2010 um 17:22:32 Uhr
Goto Top
Hach...wie schön, dass es serialize(), unserialize(), file_get_contents() und file_put_contents() gibt.
mkrasselt1
mkrasselt1 02.02.2010 um 17:37:50 Uhr
Goto Top
super, danke, es geht jetz soweit, nur das er bei jedem Besuch hochzählt,
aber das bekomm ich noch hin.
wenn ich fertig bin, zeig ich nochmal mein ergebniss vor.
Übrigens, einen mySQL Server habe ich in meinem Webspace,
der Sogar bei mir zuhause liegt, und ich selbst alles bestimmen, regeln und um die sicherheit
kümmern kann.
warum ich dann keien datenbank verwende ?
ganz einfach, diese Art und weise vereinfacht mir mieine tägliche Sicherung, und außerdem
stört diese kleine Rechnerei meine Server überhaupt nicht,
und für meine wenigen Besucher lohn es sich nicht, eine eigene Tabelle anzulegen,
obwohl das vieleicht die schnellere Variante währe.

mkrasselt1
mkrasselt1
mkrasselt1 02.02.2010 um 19:31:56 Uhr
Goto Top
so, meine Variante ist fertig,
ich habe auch noch eine Grafische ausgabe dazugebaut,
man hat 10 .gif dateien für alle Zahlenstände,
im Einzeiligen dokument besucher.txt kann man die besucherzahl eintragen
in iplog stehen die Ganzen IP-adresse der Besucher, die die seite aufgerufen haben.
Der Counter zählt die Besucher jeden Tag, und summiert sie.(
(mehrmalige Besuche an verschiedenen Tagen der Woche werden Tagweise als 1 gezählt)
hier die Scriptsamlung als .zip
http://michaelshomepage.dnsalias.com/download/besucherzaehler.zip
sie sollte als includ eingebunden werden, aus einer ebene darüber, so:
<?php include "./counter/counter.php"; ?>
happy Counting face-smile

mkrasselt1

PS: Die Bilder kann man natürlich ersetzen, einfach ein neues Gif in der Größe mit passendem Namen
in den Ordner Count legen