Überprüfen ob etwas in einer Datei steht
Andavos
- php
Hallo,
ich habe einen Counter mit IP-Sperre.
Die Datei sieht so aus:
IP|Timestamp
Wie kann ich jetzt überprüfen ob eine IP in der Datei ist oder nicht.
Ich hab mal folgenden Code versucht:
<?php
$ipadd = file("ip.txt");
if(!in_array("%$ip%",$ipadd))
{
$iprewrite = fopen("ip.txt","a");
fwrite($iprewrite, "$ip|");
fwrite($iprewrite, "$timestamp");
fwrite($iprewrite, "\n");
}
?>
Mit $ip ermittel ich die IP des User.
Wenn ich den Script jetzt aufrufe, so fügt er jedes mal meine IP + Timestamp in die datei ein.
Warum?
P.S. % ist doch in PHP wie * bei Windos, oder?
MFG
Andavos
Hi,
Wie kann ich jetzt überprüfen ob eine IP in der Datei ist oder nicht.
in dem Du sie soweit einliest, bis Du entweder auf die IP oder das Dateiende stößt.
P.S. % ist doch in PHP wie * bei Windos, oder?
Nein, in SQL.
Cheatah
Hi,
<?php
$ipadd = file("ip.txt");
if(!in_array("%$ip%",$ipadd))
vom Ansatz her nicht verkehrt. Aber file() liest eine Datei zeilenweise ein. In jeder Zeile steht dann ein String. Den musst Du erst wieder in ein Array zurückverwandeln.
Aber machs doch anders:
IP von der gepunktetetn Dezimalschreibweise in Binärzahl umwandeln. Gibts ne Funktion dafür.
Array aufbauen: IPb | Timestamp
Das Array serialisieren und abspeichern.
Bei jedem Zugriff abgespeicherte Daten holen, auspacken, die neue IP umwandeln, schauen ob sie als Index im Array steht, also einfach nach dem Timestamp an der IP-Position fragen. Wenn der ===false ist, fehlt er noch. Wenn er zu alt war, darf er überschrieben werden und "keine Sperre" sonst wird er überschrieben und "Sperre"
Natürlich ist dies eigentlich eine Anwendung für eine Datenbank.
Allerdings sind die PHP-Arrays auch ganz schön flott.
Grüße
Tom
Hi,
Bei jedem Zugriff abgespeicherte Daten holen, auspacken, die neue IP umwandeln, schauen ob sie als Index im Array steht,
Du willst die *gesamte* Datei in den Arbeitsspeicher hauen? Himmel, welchen Zweck hat das?
Natürlich ist dies eigentlich eine Anwendung für eine Datenbank.
Ja.
Cheatah
Hi Cheatah,
Bei jedem Zugriff abgespeicherte Daten holen, auspacken, die neue IP umwandeln, schauen ob sie als Index im Array steht,
Du willst die *gesamte* Datei in den Arbeitsspeicher hauen? Himmel, welchen Zweck hat das?
Bis zu einer gewissen Größe geht das viel schneller, als eine Datei Zeilenweise zu lesen. Linux (vermute ich mal als Betriebssyystem) hat zwar intelligente Block-Buffer, aber bei zeilenweiser Verarbeitung muss ebenn doch öfter zugegriffen werden.
Wenn er mehr als 100.000 verschiedene IPs auf seiner Seite hat (100.000*20Byte = 2MB mit Ovberhead) dann wird's langsam kritisch, innerhalb 0,1 Sekunden zu antworten.
Dann müsste man ja auch mal durchgehen, und uralte Einträge löschen.
Oder eben die Datenbank...
Grüße
Tom
Hi,
Du willst die *gesamte* Datei in den Arbeitsspeicher hauen? Himmel, welchen Zweck hat das?
Bis zu einer gewissen Größe geht das viel schneller, als eine Datei Zeilenweise zu lesen.
die Geschwindigkeit ist nur ein Faktor, und zwar - hoffentlich! - ein vergleichsweise unwesentlicher. Viel schwerwiegender ist die Datenmasse, die den Arbeitsspeicher in Beschlag nimmt.
Wenn er mehr als 100.000 verschiedene IPs
Wie kommst Du auf diesen (Grenz-?) Wert?
Cheatah
Hallo Cheatah,
die Geschwindigkeit ist nur ein Faktor, und zwar - hoffentlich! - ein vergleichsweise unwesentlicher. Viel schwerwiegender ist die Datenmasse, die den Arbeitsspeicher in Beschlag nimmt.
Wenn ich mich nicht irre, wird der Speicher pro Script von PHP statisch allokiert, das heißt also, pro laufendem Skript sind 8MB sowieso weg (Standardeinstellung). Wieso sollte man die dann nicht nutzen?
BTW: Gibt es eigentlich in PHP eine Funktion, die den verbleibenden Hauptspeicher anzeigt? Sowas wie memavail() oder so?
Wenn er mehr als 100.000 verschiedene IPs
Wie kommst Du auf diesen (Grenz-?) Wert?
100.000 * (4 Byte + 4 Byte Timestamp + Verkettungsinfos + Bezeichner)
Ich ging davon aus, dass 100.000 IPs + Timestamp im Speicher ca. 2MB belegen würden.
Das ist nur ein Erfahrungswert beim Umgang mit Arrays und den Funktionen dafür. Man muss ungefähr mit der vierfachen Speicherlast rechnen. Wenn Du also ein Array mit 2MB Daten nebst Bezeichnern aufbaust, dann kannst Du die leistungsfähigeren Array-Funktionen (Umsortieren, etc) gerade noch benutzen bei 8MB Speicher. Bisschen bracuht ja auch Dein Script selber noch usw.
Ist nur ein Milchmädchenwert, der aber oft passt.
Grüße
Tom