Linuchs: PHP Instanzen

Hallo,

wenn Anfragen an den Server kommen, wird ein PHP Programm gestartet. Was passiert, wenn während der Laufzeit weitere Anfragen kommen?

Und was passiert, wenn ein PHP-Programm Informationen von einem anderen Server holt und dieser sich mit der Antwort Zeit lässt oder gar nicht antwortet?

Hintergrund der Fragen ist, ob ich zulassen kann, dass Benutzer eine eigene Template-Datei auf deren Server ablegen, die gelesen, gefüllt und ausgeliefert wird.

Linuchs

  1. Tach,

    wenn Anfragen an den Server kommen, wird ein PHP Programm gestartet.

    grob ja, aber abhängig von der Serverkonfiguration wird entweder ein externer PHP-Interpreter oder der interne z.B. von mod_php anlaufen.

    Was passiert, wenn während der Laufzeit weitere Anfragen kommen?

    In den meisten Konfigurationen, wird ein weiterer Interpreter anlaufen (bis zu einer konfigurierten Obergrenze).

    Und was passiert, wenn ein PHP-Programm Informationen von einem anderen Server holt und dieser sich mit der Antwort Zeit lässt oder gar nicht antwortet?

    Dann wartet der Interpreter, sofern diese Anfrage nicht z.B. in den Hintergrund geschickt und asynchron abgearbeitet wird; es gibt sowohl in Webserver als auch PHP einen Timeout-Mechanismus, der die Abarbeitung nach konfigurierter Zeit abbricht.

    mfg
    Woodfighter

    1. Moin Woodfighter,

      grob ja, aber abhängig von der Serverkonfiguration wird entweder ein externer PHP-Interpreter oder der interne z.B. von mod_php anlaufen.

      Habe einen eigenen Server beim Hoster, kenne mich mit den Internas von Linux oder Apache kaum aus. Was macht den Unterschied?

      In den meisten Konfigurationen, wird ein weiterer Interpreter anlaufen (bis zu einer konfigurierten Obergrenze).

      Wo ist diese Grenze definiert (Dateiname?)

      Dann wartet der Interpreter, sofern diese Anfrage nicht z.B. in den Hintergrund geschickt und asynchron abgearbeitet wird; es gibt sowohl in Webserver als auch PHP einen Timeout-Mechanismus, der die Abarbeitung nach konfigurierter Zeit abbricht.

      Ja, PHP-timeout ist mir bekannt.

      Linuchs

      1. Hallo und guten Morgen,

        In den meisten Konfigurationen, wird ein weiterer Interpreter anlaufen (bis zu einer konfigurierten Obergrenze).

        Wo ist diese Grenze definiert (Dateiname?)

        Du verwendest dort doch einen Apache?
        Da handelt es sich im wesentlichen um die Begrenzung der Apache-Client-Prozesse, die üblicherweise auf 150 voreingestellt ist (max_clients). Vermutlich wird aber vorher der Speicher zuende sein, da PHP, insbesondere als CGI oder Fast-CGI, sehr speicherintensiv ist.

        Grüße
        TS

        1. Moin!

          Hallo und guten Morgen,

          In den meisten Konfigurationen, wird ein weiterer Interpreter anlaufen (bis zu einer konfigurierten Obergrenze).

          Wo ist diese Grenze definiert (Dateiname?)

          Du verwendest dort doch einen Apache?
          Da handelt es sich im wesentlichen um die Begrenzung der Apache-Client-Prozesse, die üblicherweise auf 150 voreingestellt ist (max_clients). Vermutlich wird aber vorher der Speicher zuende sein, da PHP, insbesondere als CGI oder Fast-CGI, sehr speicherintensiv ist.

          Wenn man Apache verwendet, ist aber mod_php eigentlich der Standard - und selbst mit 150 Prozessen gleichzeitig wird man auf einer gut mit RAM ausgestatteten Maschine eher nicht ins Limit des RAM geraten, außer jeder Prozess will 1 GB Speicher haben.

          Grüße Sven

          1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

            Wo ist diese Grenze definiert (Dateiname

            Du verwendest dort doch einen Apache?

            /etc/apache2/apache2.conf -> MaxClients

            Da handelt es sich im wesentlichen um die Begrenzung der Apache-Client-Prozesse, die üblicherweise auf 150 voreingestellt ist (max_clients). Vermutlich wird aber vorher der Speicher zuende sein, da PHP, insbesondere als CGI oder Fast-CGI, sehr speicherintensiv ist.

            Wenn man Apache verwendet, ist aber mod_php eigentlich der Standard - und selbst mit 150 Prozessen gleichzeitig wird man auf einer gut mit RAM ausgestatteten Maschine eher nicht ins Limit des RAM geraten, außer jeder Prozess will 1 GB Speicher haben.

            Bei Communityservern, die mit Bildern hantieren (GD-Lib), hat man leicht schon mal 128MB als Memorylimit pro Prozess eingestellt und dann steht man relativ schnell an der Wand, wenn Betrieb ist. Ist dann natürlich auch wieder Statistik.

            Spirituelle Grüße
            Euer Robert
            robert.r@online.de

            --
            Möge der wahre Forumsgeist ewig leben!
            1. Moin!

              Da handelt es sich im wesentlichen um die Begrenzung der Apache-Client-Prozesse, die üblicherweise auf 150 voreingestellt ist (max_clients). Vermutlich wird aber vorher der Speicher zuende sein, da PHP, insbesondere als CGI oder Fast-CGI, sehr speicherintensiv ist.

              Wenn man Apache verwendet, ist aber mod_php eigentlich der Standard - und selbst mit 150 Prozessen gleichzeitig wird man auf einer gut mit RAM ausgestatteten Maschine eher nicht ins Limit des RAM geraten, außer jeder Prozess will 1 GB Speicher haben.

              Bei Communityservern, die mit Bildern hantieren (GD-Lib), hat man leicht schon mal 128MB als Memorylimit pro Prozess eingestellt und dann steht man relativ schnell an der Wand, wenn Betrieb ist. Ist dann natürlich auch wieder Statistik.

              Wenn man viel Traffic bei Bilduploads erwartet, dafür aber nicht die geeignete Hardwareausstattung für simultane, synchrone Verarbeitung bereitstellen kann, muss man sich was anderes ausdenken - beispielsweise die Bildskalierungsaufträge in eine Queue einstellen und seriell abarbeiten lassen - mit deutlich geringerem parallelen Ressourcenverbrauch.

              Oder anders gesagt: Wer weiß, dass jeder seiner parallel reinkommenden PHP-Requests das erlaubte Memory-Limit von 128 MB ausreizt, und nur 1 GB RAM installiert ist, der kann nur 8 Requests gleichzeitig erlauben, nicht 150.

              Grüße Sven

  2. Hallo und guten Morgen,

    Hintergrund der Fragen ist, ob ich zulassen kann, dass Benutzer eine eigene Template-Datei auf deren Server ablegen, die gelesen, gefüllt und ausgeliefert wird.

    Ich mache das anders herum:

    Wenn die Anfrage direkt an meinen Server gerichtet wird, werden ja augenscheinlich die aktuellen Daten von meinem Server, verpackt in einem mehr oder weniger alten Template des Kunden abgerufen. Da kann das Template gecached oder sogar statisch gespeichert werden. Schließlich sollte es vor der Benutzung auch auf Validität geprüft werden.

    Wenn der Request an den Server des Kunden geht, und der nur Daten von mir einbinden will, muss der das Template aktiv senden (posten) und bekommt es ausgefüllt zurück, um es bei sich einzusetzen.

    So bleibt das Ganze überschaubar auch in Bezug auf den Server-to-Server-Traffic.

    Dies hat allerdings eine Einschränkung: wenn jemand keinen aktives Serverbackend hat, dann kann er auch nur "passive Templates" bei mir hinterlegen und keine "aktiven" auf seinem eigenen Host ablaufen lassen.

    Grüße
    TS

  3. EIN Prozess <=> EINE Response

    Aufpassen musst Du, wenn Prozesse im Speicher verbleiben und den der ersten folgenden Responses immer wieder dasselbe Template mit denselben Platzhaltern ausliefern wollen. Dies sollte naürlich nicht passieren, d.h., sorge daür, dass alle Benutzredaten einschli. Sessiondaten aus dem Hauptspeicher rausfliegen und das Response-Objekt jedesmal (für jede Response) neu erstellt wird.

    Ansonsten hat jeder Prozess seinen eigenen Speicherbereich.

    Dag

    1. Tach,

      EIN Prozess <=> EINE Response

      das stimmt zwar im Zusammenhang mit mod_php (das nicht mit einem threaded mpm von Apache benutzt werden sollte), aber z.B. mit PHP per fcgi läuft problemlos threadbasiert.

      Aufpassen musst Du, wenn Prozesse im Speicher verbleiben und den der ersten folgenden Responses immer wieder dasselbe Template mit denselben Platzhaltern ausliefern wollen. Dies sollte naürlich nicht passieren, d.h., sorge daür, dass alle Benutzredaten einschli. Sessiondaten aus dem Hauptspeicher rausfliegen und das Response-Objekt jedesmal (für jede Response) neu erstellt wird.

      Diese Beschreibung passt nicht zu meinen Vorstellungen von Entwicklung mit PHP; soweit ich weiß hat man auf all diese Dinge erstmal keinen Einfluss.

      mfg
      Woodfighter

      1. Diese Beschreibung passt nicht zu meinen Vorstellungen von Entwicklung mit PHP; soweit ich weiß hat man auf all diese Dinge erstmal keinen Einfluss.

        Natürlich hast Du darauf Einfluss, wäre ja schlimm, wenn jeder Besucher dasselbe Template, was der Erste der kam, einmal ausgefüllt in den Hauptspeicher geladen hat, mit denselben gerenderten Daten sehen würde ;)

        1. Hallo und guten Morgen,

          Diese Beschreibung passt nicht zu meinen Vorstellungen von Entwicklung mit PHP; soweit ich weiß hat man auf all diese Dinge erstmal keinen Einfluss.

          Natürlich hast Du darauf Einfluss, wäre ja schlimm, wenn jeder Besucher dasselbe Template, was der Erste der kam, einmal ausgefüllt in den Hauptspeicher geladen hat, mit denselben gerenderten Daten sehen würde ;)

          Direkte Speicherzugriffe sind bei PHP üblicherweise nicht vorgesehen, es sei denn, man will ausdrücklich shared Memory benutzten. Das ist aber weder der Normalfall noch ganz einfach :-)

          http://php.net/manual/de/book.shmop.php
          http://php.net/manual/de/book.sem.php

          Grüße
          TS

        2. Tach,

          Diese Beschreibung passt nicht zu meinen Vorstellungen von Entwicklung mit PHP; soweit ich weiß hat man auf all diese Dinge erstmal keinen Einfluss.

          Natürlich hast Du darauf Einfluss, wäre ja schlimm, wenn jeder Besucher dasselbe Template, was der Erste der kam, einmal ausgefüllt in den Hauptspeicher geladen hat, mit denselben gerenderten Daten sehen würde ;)

          ich wüsste nichtmal, wie man mit PHP ohne speziell dafür entwickelten Erweiterungen oder anderen Umwegen zwischen PHP-Prozessen kommunizieren könnte; dementsprechend ist deine Warnung für diese Sprache ziemlich unsinnig.

          mfg
          Woodfighter

    2. Moin!

      Aufpassen musst Du, wenn Prozesse im Speicher verbleiben und den der ersten folgenden Responses immer wieder dasselbe Template mit denselben Platzhaltern ausliefern wollen. Dies sollte naürlich nicht passieren, d.h., sorge daür, dass alle Benutzredaten einschli. Sessiondaten aus dem Hauptspeicher rausfliegen und das Response-Objekt jedesmal (für jede Response) neu erstellt wird.

      Diese Warnung ist für PHP Unsinn. PHP speichert nichts nach dem Request-Ende ab, man müsste extra Aufwand betreiben, wenn man das haben wollte.

      Ein Response-Objekt existiert in PHP auch nur dann, wenn das PHP-Skript sich eines definiert und instantiert. PHP kann auch ganz ohne Objekte Requests verarbeiten und Responses zurückgeben.

      Grüße Sven