kostenloser Webspace werbefrei: lima-city


Performance Datei lesen vs. Datenbank lesen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    Hallo Leute,

    ich arbeite gerade an einem Web-Projekt und es kommt mir gerade die Frage aus, was performanter ist.

    Hintergrund:
    In meinem Web-Projekt baue ich gerade ein automatisches Sperrsystem. Dabei wird bei jedem Seitenaufruf geprüft, ob die IP des Besuchers bereits in einer Datenbank steht und sein Zugriff somit geblockt wird.

    Nun mein Gedanke, ist es für die Performance besser zu prüfen, ob eine Datei mit dem Namen (Bsp: 192.168.0.0.ban) existiert oder eine Datenbank abzufragen, ob die IP in der Tabelle enthalten ist.
    Wohlgemerkt bei jedem Aufruf wird geprüft.

    Schon einmal vielen Dank für eure Hilfe

    MFG Michael
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. In deinem Fall würde ich auf eine Datenbank setzen.

    Bei kleinen Datenmengen ist das Filesystem oder eine SQLite Datenbank schneller. Bei größeren Datenmengen ist eine MySQL oder Maria Datenbank schneller.
  4. interessant wäre ein direkter Vergleich beider Methoden mit echten Daten und den daraus resultierenden Zeitmessungen auf jeden Fall!
    Ich persönlich würde aber auf jedenfall auf eine DB setzten.
    Wenn Dir der Aspekt Performance dabei auch noch wichtig ist, dann kannst Du Dir ja mal zusätzlich folgendes anschauen:
    CREATE TABLE foobar ENGINE=MEMORY;
    :spammer:
    Gruß Dunkeltuten
  5. all-in1 schrieb:
    Bei kleinen Datenmengen ist das Filesystem oder eine SQLite Datenbank schneller. Bei größeren Datenmengen ist eine MySQL oder Maria Datenbank schneller.

    Ich würde auch NoSQL Datenbanken (MongoDB, Cassandra, etc) mit einbeziehen.

    Wenn es um Geschwindigkeit geht, sind diese in manchen Fällen um einiges schneller wie SQL-Datenbanken.

    (Es kommt allerdings auf das System an. Manche Datenbanken machen schnellere Inputs und langsame Selects, andere schnellere Selects, ...)

    Allerdings sind NoSQL Lösungen aktuell fast nur realisierbar, wenn du einen Server und kein Webspace hast ...
  6. Ich würde es lösen indem ich sinnvoll programmiere und die ban-Liste im Speicher lasse, und somit nur einmal (beim ersten Aufruf) laden muss, wo das dann her kommt ist von der Datenmenge und den Anzahl an zu verarbeitenden Einträgen abhängig.

    Wenn es um eine einfache Textdatei mit überschaubarer Anzahl an Einträgen geht ist das Dateisystem mit hoher Wahrscheinlichkeit schneller als eine Datenbank (die im zweifel auf einem anderern physikal. System liegt). Wenn viele Einträge zu prüfen sind oder die Datenmenge der Einträge nicht vernachlässigbar ist sollte man eine Datenbanklösung favorisieren.

    In jedem Falle gilt aber: Eine gute Lösung abstrahiert diese Fragestellung und ermöglicht durch einsetzen eines dedizierten Moduls für jede mögliche Variante die wahlweise Verwendung beider Möglichkeiten, denn deinem System ist es ja völlig egal woher die Daten stammen, es ist nur der Inhalt relevant.

    Aber das sind Designfragen über die man nachgedacht haben sollte bevor man implementiert.
  7. In PHP gibt es einen microtime()-Befehl, mit dem du die aktuelle Zeit in Mikrosekunden ermitteln kannst.

    Am besten eine Beispieldatei bzw. -Datenbank mit vielen Einträgen erstellen, die Zeit vor und nach der Abfrage in Variablen speichern und die Differenz berechnen.

    Der kleinere Wert gewinnt!

    Hier noch ein Link zu einer etwas ausführlicheren Anleitung:
    http://www.johannesschwichtenberg.de/code/php-how-to-scriptlaufzeit-messen-hochsetzen.html

  8. schwendinegfraiser

    schwendinegfraiser hat kostenlosen Webspace.

    Was auch technisch möglich wäre: eine Datei für eine IP Adresse erstellen. Dort kann man dann ein "blockiert" oder "nicht blockiert" reinschreiben. Das dürfte auch schnell sein. Allerdings muss es für jede einzelne IP Adresse einen bestimmten Dateinamen geben.

    Ob das aufgrund der vielen Datein SInn macht, mußt aber du wissen, da ich wie alle anderen nicht genau weiß, was dein Endprodukt machen soll.

    Beitrag zuletzt geändert: 27.2.2017 16:03:07 von schwendinegfraiser
  9. Im PHP-Framework rexo (http://rexo.ch) gibt es dafür eine fertige, sehr performante Lösung. Die IP-Nummern werden dabei komprimiert in einem File abgelegt. Danach wird einfach geprüft, ob die entsprechende wiederum komprimierte IP im File vorkommt.
  10. Hi,
    Wenn es Dir auf Performanceankommt hältst Du die geblockten IPs im Speicher. Am Besten geht das mit einer Datenstruktur wie Set:
    http://php.net/manual/en/class.ds-set.php
    Diese befüllst Du mit jeder geblockten IP.
    Bei der Abfrage kannst du mit
    public bool contains ([ mixed $...values ] )
    sehr schnell prüfen ob die IP enthalten ist.

    Wenn die Anforderung besteht, dass nach einem Serverneustart / Neustart Apache die geblockten IPs wieder zur Verfügung stehen, dann musst du parallel zum setzen der IPs in das Set die IP auch in eine DB speichern. Beim Hochfahren / Initialisieren der Anwendung ließt Du einmal alle geblockten IPs wieder in das Set ein. Dabei ist dann die Performance zweitrangig, da die eigentliche Abfrage immer über das Set im Speicher passiert. Und diese Anfrage ist schneller wie ein Datei oder DB Zugriff.


    Beitrag zuletzt geändert: 5.6.2017 23:11:24 von mruts
  11. Autor dieses Themas

    michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    Hui Leute,

    jetzt melde ich mich mal zu meinem Thema wieder :)

    Meine Lösung war eine Datenbankabfrage, welche bei jedem Aufruf prüft ob die eigene IP gesperrt wurde.
    Ist die IP gesperrt, wird die Sperrzeit in die Session des Clients gespeichert.
    Wurde die Session gelöscht obwohl die IP noch gesperrt ist, wird eine neue Session mit der IP Sperre erstellt.
    Wurde die IP verändert aber die Session existiert noch, wird die restliche Sperrzeit mit der neuen IP wieder in die DB geschrieben.

    Um das nun performanter zu gestalten, habe ich eine ähnliche Lösung, wie die von mruts vorgeschlagen, verwendet.

    mruts schrieb:
    Hi,
    Wenn es Dir auf Performanceankommt hältst Du die geblockten IPs im Speicher. Am Besten geht das mit einer Datenstruktur wie Set [...]


    Da ich diese Datenstruktur nachinstallieren muss (was nicht überall geht) nutze ich die Funktion: shmop_open() und erzeuge einen "Open shared memory block".
    Der erste Aufrufer der Seite erzeugt diesen, wenn er nicht schon vorhanden ist und lädt die gesperrten IPs in den Speicherblock.
    Alle Abfragen gehen nun an diesen Speicherblock. Wird eine IP gesperrt, wird diese im Speicherblock sowie der DB gespeichert.

    Vielen Dank für eure Vorschläge.

    MFG Micha
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!