Besucherzähler
Wolfgang
- php
Guten Abend erstmal.
In der Hoffnung, dass mir wieder so professionell geholfen werden kann hier mein Anliegen:
Ich möchte auf meiner Homepage einen Besucherzähler mit IP-Sperre einbinden.
Einen Code dafür hab ich soweit:
<?php
$ipdatei = fopen("ips.txt","w+");
$counterdatei = fopen("counter.txt","w+");
$currentip = $_SERVER["REMOTE_ADDR"];
$lastip = fgets($ipdatei, 21);
$counterstand = fgets($counterdatei, 10);
if($counterstand == "")
{
$counterstand = 0;
}
if($currentip != $lastip)
{
$counterstand = $counterstand + 1;
echo $counterstand;
rewind($ipdatei);
fwrite($ipdatei, $currentip);
rewind($counterdatei);
fwrite($counterdatei, $counterstand);
}
else
{
echo $counterstand;
}
fclose($ipdatei);
fclose($counterdatei);
?>
Mein Problem ist jetzt allerdings, dass ich zwar die IP und so weiter alles kurzzeitig speichern möchte (jedenfalls um den Counter zu "sperren"), allerdings soll man die "ips.txt" nicht direkt über den Dateinamen mit dem Browser auslesen können.
Lässt sich dies über die Dateirechte irgendwie realisieren? Oder kann ich evtl. ganz auf die Text-Dateien verzichten?
Das ganze läut über einen Apache-Server auf dem ich leider keinen SQL-Zugriff habe.
Vielen Dank und freundliche Grüße,
Wolfgang
Hello,
Einen Code dafür hab ich soweit:
der aber so nicht funktionieren kann.
[code lang=php]<?php
$ipdatei = fopen("ips.txt","w+");
$counterdatei = fopen("counter.txt","w+");
$currentip = $_SERVER["REMOTE_ADDR"];
$lastip = fgets($ipdatei, 21);
$counterstand = fgets($counterdatei, 10);
Lässt sich dies über die Dateirechte irgendwie realisieren? Oder kann ich evtl. ganz auf die Text-Dateien verzichten?
Das ganze läut über einen Apache-Server auf dem ich leider keinen SQL-Zugriff habe.
Damit die Dateien nicht direkt über HTTP auslesbar sind, sollten sie außerhalb der Dokument Root gespeichert werden, oder als provisorische Hilfsmaßnahme ihre Namen einfach mit '.ht' beginnen. Die Standardeinstellung des Apachen ist, dass solche Files nicht ausgeliefert werden per HTTP und HTTPS
Musst Du natürlich ausprobieren, ob das auch bei Dir die Einstellung ist.
Und dann musst Du ja wohl noch das Zählerscript neu schreiben ...
Es fehlt außerdem noch ein Locking-Mechanismus.
Du kannst auch beide Datenwerte in eine Datei schreiben. Dafür bietet sich ein serialisiertes Array an.
Es bietet sich außerdem an, diese "IP-Sperre" zeitabhängig zu machen.
Das gesamte Script wird dann allerdings etwas aufwändiger, aber die sehr umstrittene (weil eigentlich unsinnige) IP-Sperre wird dadurch ein wenig weniger unsinnig.
Da aber Statistiken immer die besten Lügen sind, ist eine solche "IP-Sperre" in der Praxis durchaus einsetzbar :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Guten Tag,
Ich möchte auf meiner Homepage einen Besucherzähler mit IP-Sperre einbinden.
Hast du mal bei deinem HSP angefragt, ob du Zugriff auf die Logdateien des Webservers bekommen kannst? Dort sind qualitativ wesentlich bessere Informationen enthalten.
Fredrik Ramm hat dazu einen lesenswerten Text geschrieben: Warum nur Anfänger Counter benutzen
Gruß
Christoph Jeschke
Hallo zusammen.
Vielen Dank für die schnellen und hilfreichen Ratschläge.
Hätte nicht gedacht, dass um diese Uhrzeit noch so viele unterwegs sind.
Da das ganze über den Server über meine Uni läuft, habe ich mir einen Termin beim zugehörigen Dozenten geben lassen.
Das Skript läuft zwar mittlerweile, aber ist sicher noch verbesserungswürdig.
Nochmals vielen Dank und noch einen schönen Tag!
Wolfgang
Hello,
Da das ganze über den Server über meine Uni läuft, habe ich mir einen Termin beim zugehörigen Dozenten geben lassen.
Wenn etwas dabei herausgekommen ist, könntest Du uns das Ergebnis hier posten.
Ich zumindest bin immer neugierig auf anderer Leute Lösungen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Das ist der Code der letztendlich rausgekommen ist.
Habe nur den Anfang ändern müssen, weil ich noch aus einem anderen Unterverzeichnis auf die Dateien zugreifen wollte.
Außerdem habe ich die Dateien umbenannt, sodass diese über den Apache-Server nicht ausgeliefert werden...
Nochmals Danke für die Ratschläge!
<?php
$ipdatei = fopen(dirname( __FILE__ ).'/.htips',"r+");
$counterdatei = fopen(dirname( __FILE__ ).'/.htcounter',"r+");
$currentip = $_SERVER["REMOTE_ADDR"];
$lastip = fgets($ipdatei, 21);
$counterstand = fgets($counterdatei, 10);
if($counterstand == "")
{
$counterstand = 0;
}
if($currentip != $lastip)
{
$counterstand = $counterstand + 1;
echo $counterstand;
rewind($ipdatei);
fwrite($ipdatei, $currentip);
rewind($counterdatei);
fwrite($counterdatei, $counterstand);
}
else
{
echo $counterstand;
}
fclose($ipdatei);
fclose($counterdatei);
?>
Hello,
Das ist der Code der letztendlich rausgekommen ist.
Sieht schon besser aus.
Habe nur den Anfang ändern müssen, weil ich noch aus einem anderen Unterverzeichnis auf die Dateien zugreifen wollte.
Außerdem habe ich die Dateien umbenannt, sodass diese über den Apache-Server nicht ausgeliefert werden...
Über den Sinn und Unsinn solcher Zähler kann man ja wunderbar streiten. Aber ich denke, als Lernobjekt für Nebenläufigkeit sind sie gut geeignet. Leider hast Du die hier überhaupt noch nicht berücksichtigt und darum ist die Version auch nicht stabil.
Sowie tatsächlich konkurrierender Betrieb auftritt, der auf einer auch nur mäßig besuchten Webseite immer herrschen sollte, dann gehen Dir die Dateien kaputt.
Außerdem hast Du die Längen-Änderung der Dateiinhalte noch nicht berücksichtigt.
<?php
$ipdatei = fopen(dirname( FILE ).'/.htips',"r+");
$counterdatei = fopen(dirname( FILE ).'/.htcounter',"r+");
if ($ipdatei and $counterdatei)
{
if (flock($ipdatei, LOCK_EX) and ## Dateien gegen andere Prozesse schützen
flock($counterdatei, LOCK_EX)) ## während man selber darin arbeitet
{
$currentip = $_SERVER["REMOTE_ADDR"];
$lastip = fgets($ipdatei, 21); ## 4*3 + 3 + 2 = 17, also lang genug
$counterstand = fgets($counterdatei, 10); ## acht- bis neunstellig dezimal
#> if($counterstand == "")
#> {
#> $counterstand = 0;
#> }
$counterstand = intval($counterstand); ## macht PHP aber nachher automatisch,
## wenn Du damit rechnest
if($currentip != $lastip)
{
$counterstand = $counterstand + 1;
#> echo $counterstand;
rewind($ipdatei);
fwrite($ipdatei, $currentip);
ftruncate($ipdatei, ftell($fh)+1); ## IP-Sttings können unterschiedlich
## lang sein
rewind($counterdatei);
fwrite($counterdatei, $counterstand);
ftruncate($counterdatei, ftell($fh)+1); ## das ist nicht notwendig, wenn
## das Literal für den Zählerstand
## immer länger wird.
}
#> else
#> {
#> echo $counterstand;
#> }
echo $counterstand;
}
fclose($ipdatei);
fclose($counterdatei);
}
else
{
echo "kein Zählerstand verfügbar";
}
?>
Ich habe noch ein bisschen darin herumgeändert. So sollten die Probleme bezüglich konkurrieredem Betrieb und Längenanpassung der Dateien erledigt sein.
Beachte auch die auskommenterierten Zeilen. Die fallen weg.
Versuch doch nochmal, die beiden Daten in eine Datei zu scheiben.
Dazu gibt es in PHP unterschiedliche Möglichkeiten (Nach Bequemlichkeit geordnet):
- serialize() und unserialize() <http://de.php.net/manual/de/function.serialize.php
- substr() und str_pad() [link:http://de.php.net/manual/de/function.str-pad.php>
- pack() und unpack() <http://de.php.net/manual/de/function.pack.php>
Wie Du siehst, treten die Funktionen immer paarig auf. Behandlung der Daten nach der Verarbeitung vor dem Wegschreiben - Behandlung der Daten nach dem Wiederholen vor der Verarbeitung.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>