Linuchs: Wie können sich PHP-Instanzen verständigen?

Hallo,

eine Webseite wird von Menchen und Maschinen mehrmals in der Sekunde aufgerufen.

Der Programmdurchlauf kann mehr als eine Sekunde dauern, weil DB-Abfragen den neuesten Datenstand ermitteln, z.B. welche Orte mit anderen Programmen zuletzt aufgerufen wurden.

Da der neueste Stand nicht sekündlich erzeugt werden muss, möchte ich die DB-Ergebnisse in einer Textdatei CSV speichern und erst dann neu erzeugen, wenn die Datei 30 sec oder älter ist.

Doch was passiert, wenn zwei oder mehrere parallel laufende PHP-Instanzen die Datei erzeugen wollen?

Wie ist das zu koordinieren?

Linuchs

  1. ... ich habe einfach mal vermutet, dass ein Multi-Tasking-System wie Linux mehrere PHP-Instanzen gleichzeitig laufen hat. Ist das der Fall?

    Oder werden die Anforderungen per Warteschlange einzeln abgearbeitet?

    1. ... ich habe einfach mal vermutet, dass ein Multi-Tasking-System wie Linux mehrere PHP-Instanzen gleichzeitig laufen hat. Ist das der Fall?

      Davon gehe ich aus. Könnt man aber einfach testen, mit ein paar sleep im Script, dazwischen Ausgaben der aktuellen Zeit und das dann zweimal parallel aufrufen.

      So eine Synchronisation würde ich in der Datenbank erledigen. Das Script schaut ob in letzter Zeit schon jemand die Datei erzeugt hat, dann nimmt es die. Wenn die zu alt ist trägt es sich ein und macht die Datei selbst. Wenn ein anderer grad dran ist wartet es darauf.

    2. ... ich habe einfach mal vermutet, dass ein Multi-Tasking-System wie Linux mehrere PHP-Instanzen gleichzeitig laufen hat. Ist das der Fall?

      Ja, daher macht Deine Eingangsfrage Sinn.

      Oder werden die Anforderungen per Warteschlange einzeln abgearbeitet?

      Das würde Deine Frage evtl. lösen, wäre für die Performance aber eher... nun... schlecht ;-)

    3. ... ich habe einfach mal vermutet, dass ein Multi-Tasking-System wie Linux mehrere PHP-Instanzen gleichzeitig laufen hat. Ist das der Fall?

      Hallo,

      das kann Linux natürlich, aber letztendlich kommt das auf die Konfiguration des Webservers an, bzw. auf die Anzahl seiner Workertasks.

      Gruß
      Stefanie

  2. Doch was passiert, wenn zwei oder mehrere parallel laufende PHP-Instanzen die Datei erzeugen wollen?
    Wie ist das zu koordinieren?

    Es gibt zig Möglichkeiten, die IMHO stabilste wäre aber: überhaupt nicht. Akzeptiere, dass es passieren kann und nimm einen atomaren Prozess am Ende der Verarbeitung. Wenn z.B. 10 Prozesse parallel zunächst "ihre eigene" Datei erzeugen ("/tmp/$PID$Timestamp.csv" oder "/temp/$UUID.csv") und als letzten Schritt ein "move /tmp/unique-temp.csv /var/www/eigentliche-csvdatei.csv" ausführen, bist Du IMHO safe.

  3. Hakuna matata!

    Da der neueste Stand nicht sekündlich erzeugt werden muss, möchte ich die DB-Ergebnisse in einer Textdatei CSV speichern und erst dann neu erzeugen, wenn die Datei 30 sec oder älter ist.

    Du hast also eine teure Berechnung und möchtest das Ergebnis zwischenspeichern, das nennt man auch Caching. MySQL und die meisten anderen Datenbank-Systeme haben schon Caches integriert, die solltest du nutzen:

    http://dev.mysql.com/doc/refman/5.7/en/query-cache.html

    Und die solltest du wirklich nutzen, denn Caches sind extrem schwierig zu verwalten.

    „There are only two hard things in Computer Science: cache invalidation and naming things.“ – Phil Karlton

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. Tach!

      Du hast also eine teure Berechnung und möchtest das Ergebnis zwischenspeichern, das nennt man auch Caching. MySQL und die meisten anderen Datenbank-Systeme haben schon Caches integriert, die solltest du nutzen:
      http://dev.mysql.com/doc/refman/5.7/en/query-cache.html

      Die Kurzform: Wenn die Query komplett gleich zu einer bereits gestellten ist, kann das Ergebnis aus dem Cache genommen werden. Wenn der Zeitpunkt also nicht die aktuelle sekundenfeine Zeit ist, sondern gerundet auf 30 Sekunden oder ganze Minuten, dann ist die Aufgabe schon erledigt.

      dedlfix.

      1. Hi,

        Die Kurzform: Wenn die Query komplett gleich zu einer bereits gestellten ist,

        und sich der Datenbestand nicht geändert hat

        kann das Ergebnis aus dem Cache genommen werden.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Tach!

          Die Kurzform: Wenn die Query komplett gleich zu einer bereits gestellten ist,
          und sich der Datenbestand nicht geändert hat
          kann das Ergebnis aus dem Cache genommen werden.

          Ja, aber der Zusatz ist ein bisschen wie ein weißer Schimmel. Wenn sich die Daten ändern, muss der Cache invalide werden. Das ist ein zwingendes Merkmal jedes Caches, der vom Daten verwaltenden System gesteuert werden kann. (Web-Caches (aka Proxys) können das beispielsweise nicht.)

          dedlfix.

      2. Ich habe mal gelesen, dass interne MySQL Verwaltung des Caches eventuell mehr Performance kostet als die Abfrage an sich. Deshalb sollte man immer prüfen ob die Nutzung des MySQL Caches wirklich Vorteile bringt. Es soll Fälle geben, wo sie eher ausbremst, weshalb sie per Default abgeschaltet ist.

        Habe ich das richtig gelesen?

        Gruß
        Vorurteil verbreitender
        T-Rex

        1. Tach!

          Ich habe mal gelesen, dass interne MySQL Verwaltung des Caches eventuell mehr Performance kostet als die Abfrage an sich. Deshalb sollte man immer prüfen ob die Nutzung des MySQL Caches wirklich Vorteile bringt.

          Das kann der Fall sein, wenn man nur unterschiedliche Querys startet, was zumindest für den vorliegenden Fall nicht so ist. Ob der Rest des Systems darunter leidet, muss der OP anhand seiner Gegebenheiten ermitteln.

          Es soll Fälle geben, wo sie eher ausbremst, weshalb sie per Default abgeschaltet ist.

          Meine Annahme war, dass er angeschaltet ist und ausgeschaltet werden kann. Aber was nun konkret konfiguriert ist, muss man sowieso im jeweiligen System prüfen. Da nützt das Wissen um Default-Einstellungen wenig.

          dedlfix.

        2. Hakuna matata!

          Ich habe mal gelesen, dass interne MySQL Verwaltung des Caches eventuell mehr Performance kostet als die Abfrage an sich. Deshalb sollte man immer prüfen ob die Nutzung des MySQL Caches wirklich Vorteile bringt. Es soll Fälle geben, wo sie eher ausbremst, weshalb sie per Default abgeschaltet ist.

          Habe ich das richtig gelesen?

          Der Cache braucht natürlich auch seine Rechenressourcen, aber die Kosten für einen Cache-Zugriff stehen in einem konstanten Verhältnis zur Größe der Ergebnismenge. Die Kosten für eine nicht gecachte Datenbank-Abfrage sind im allgemeinen sehr viel höher und sie wachsen mit der Anzahl der Zeilen in den involvierten Tabellen (Indizes und andere Optimierungen mal außen vor).

          Der Overhead des Caches ist folglich konstant und wird deshalb wohl kaum zu einem Flaschenhals in einer Anwendung werden und im allgemeinen Fall wird man damit sogar Verbesserungen erzielen.

          --
          “All right, then, I'll go to hell.” – Huck Finn
  4. Ola,

    also eine Datei kannst du in PHP exklusiv sperren

    Jedoch würde ich noch einen Schritt weiter gehen und gleich das komplette html Cachen und zwar nicht für < 1 Minute sondern für sagen wir mal 30 Minuten. Hängt natürlich ein wenig von der Anwendung ab. Einen Chat kann man natürlich nicht cachen ;).

    Dann hättest du im idealfall nur noch die Prüfung "gibts die Datei xy und ist sie jünger als 30 Minuten" -> ja, dann gib Inhalt der html Datei zurück.

    Das geht so schnell da kann man nicht mal einen Gruß verfassen.

    1. Om nah hoo pez nyeetz, T-Rex!

      Das geht so schnell da kann man nicht mal einen Gruß verfassen.

      *g*

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Hort und Hortensie.