Frage zur Arbeitsweise von PHP



  • Hallo

    Ich hab' da mal eine Frage, und zwar wie werden in PHP verschiedene Variablen fuer Verschiedene Nutzer gehandhabt?

    Sagen wir ich habe ein Eingabefeld, der Nutzer gibt sein Passwort ein, dann ist in z.B. _POST["login"] dieses Passwort gespeichert. Um zu gucken, ob der User eingeloggt ist, wird dann immer das Passwort aus der Datenbank mit dem _POST["login"] verglichen.

    Soweit so gut, aber was ist wenn 10 Nutzer auf der Seite sind, alle sind eingeloggt? Was steht dann in _POST["login"]? Fuer jeden etwas anderes? Wie haelt PHP bzw der Webserver das auseinander? Und ab wann steht da fuer den jeweiligen Nutzer "nichts mehr"?

    Danke und Gruss



  • Immer wenn du eine PHP-Seite aufrufst wird ein neuer Prozess gestartet (php.exe) auf dem Rechner! Wenn 2 Nutzer die Seite aufrufen hast du 2 Prozesse und die haben miteinander nix zu tun.



  • Hallo

    also, wie mein Vorgänger sagte, jedes Mal, wenn es einen Request auf eine Seite gibt, guckt der Webserver, was für eine Datei er übergeben soll. Wenn es eine .php Datei ist, dann übergibt diese Datei zuerst PHP, PHP parst die Datei und die von PHP erzeugte Ausgabe wird vom Webserver an den User weitergeleitet.

    Für jeden Aufruf von PHP, den der Webserver macht, startet ein neuer Prozess. Die Prozesse haben nichts miteinander zu tun, d.h. es ist als würde man 2 mal das gleiche Programm ausführen.

    Damit der User an den Server auch Daten (wie Formulare Daten) zu schicken, die der Webserever an PHP auch weiterleitet, gibt es Protokolle, GET, POST.



  • können es auch Threads sein. Denkt mal an PHP als mod in apache.



  • Hallo,

    Danke fuer die Antworten 🙂 Ja das macht Sinn, allerdings ergeben sich daraus nochmal 2 Fragen fuer mich.

    1. Wann wird ein Prozess/Thread dann wieder beendet? Wenn der Benutzer den Browser schliesst? Schickt der Browser dann Quasi ein Paket das besagt das die Sitzung beendet wurde und der Server reagiert in dem er den Prozess/Thread beendet?
    2. Laesst sich das nicht einfach ausnutzen, um Server zu flooden? Das viele Prozesse einen Server hindern vernuenftig zu arbeiten ist ja klar, wenn man zB an fork-Bombe oder so denkt.
    Wie schuetzt sich der Server davor? Und das ein Webserver mehrere Tausend Klicks in der Minute verarbeiten muss, von Tausenden verschiedenen Nutzern, ist ja keine seltenheit. Wie werden dann ueber 1000 Prozesse verarbeitet?



  • ich glaube die php-threads laufen nur solange der http-request abgefrühstückt wird. ist der webserver fertig mit übertragen der seite schliesst er die tcp-verbindung und killt den php-thread. anders wär's ja doof. die benutzer auseinanderhalten kann php doch mit diesen session-ids oder wie das heisst. keine ahnung wie der die generiert, eventuell aus ip-adresse und portnummer des users. ansonsten ist php auch noch cookie-fähig



  • wenn das script beendet und abgearbeitet ist beendet sich php.
    http ist ein verbindungsloses protokoll.
    d.h. es wird gesendet/empfangen/geschlossen. und dann wieder von vorne.
    gilt aber nicht für stream.



  • http ist ein verbindungsloses protokoll.
    d.h. es wird gesendet/empfangen/geschlossen. und dann wieder von vorne.

    nicht richtig



  • http experte schrieb:

    nicht richtig

    naja, sagen wir mal 'zustandslos'



  • miriam85 schrieb:

    1. Wann wird ein Prozess/Thread dann wieder beendet? Wenn der Benutzer den Browser schliesst? Schickt der Browser dann Quasi ein Paket das besagt das die Sitzung beendet wurde und der Server reagiert in dem er den Prozess/Thread beendet?

    Nein, PHP funktioniert auf eine etwas andere Art und Weise:

    Wenn du im Browser eine Seite aufrufst, (z.B. durch "http://server.tld/login.php?user=mk90") schickt der Browser die HTTP-Anfrage an den Server (hier "server.tld").
    In dieser Nachricht steht dann sowas drin wie "GET login.php?user=mk90\r\n". Wenn der Server die Nachricht bekommt interpretiert er das so:
    Das "GET" heißt (ungefähr) der anfordernde Client will Daten haben und zwar passend zu der Anforderung "login.php?user=mk90". Den Teil hinter dem Fragezeichen ignoriert der Server erstmal, er sucht jetzt die Datei "login.php". Er erkennt, dass das eine PHP-Datei ist, und in seiner Konfiguration steht, er soll PHP-Dateien php.exe (PHP-Interpreter) übergeben. Also startet er den PHP-Interpreter und übergibt ihm "login.php" und irgendwie (keine Ahnung wie, vielleicht übergibt der Server auch noch das) erfährt der PHP-Interpreter auch noch die Variablen wie "user=mk90".
    Der Interpreter interpretiert dann die PHP-Seite, also spuckt den HTML-Code direkt zur Standardausgabe aus und führt die Script-Parts (in denen auch wieder was zur Standardausgabe ausgegeben werden kann) aus.
    Die Standardausgabe vom Interpreter fängt der Server auf und sendet diese dann zurück an den Client. Er sendet erst wenn der PHP-Code vollständig abgearbeitet ist. Der Interpreter ist dann schon beendet.

    PHP steht ja für PHP Hypertext PreProcessor (logisch: eine "rekursive Abkürzung" !?). Die Seite auf dem Server wird also verarbeitet und das Ergebnis wird zum Client geschickt.

    mfg
    mk90

    PS: Ich bin eigentlich auch noch ein ziemlicher PHP-Neuling und froh über alles was ich erfahr.


  • Mod

    Er sendet erst wenn der PHP-Code vollständig abgearbeitet ist. Der Interpreter ist dann schon beendet.

    Ne, die Ausgabe wird gleich rausgehauen, es sei denn du pufferst explizit. Dann wird natürlich erst gepuffert und erst beim flush geschrieben. idR macht man es ungepuffert.


Anmelden zum Antworten