Gleichzeitige Anfragen an PHP Script

85

Wenn die PHP-Engine bereits ein Skript auf dem Server ausführt, was würde dann mit anderen gleichzeitigen Browseranforderungen an dasselbe Skript geschehen?

  • Werden die Anfragen in die Warteschlange gestellt?
  • Werden sie ignoriert?
  • Wird jede Anfrage eine eigene Skriptinstanz haben?
  • Irgendeine andere Möglichkeit?
Kevin Boyd
quelle
1
Überprüfen Sie auch diese Antwort: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Antworten:

140

Abhängig von seiner Konfiguration kann der Server im Allgemeinen Hunderte von Anforderungen gleichzeitig bearbeiten. Wenn Sie Apache verwenden, MaxClientslautet die Konfigurationsoption wie folgt:

Die MaxClientsRichtlinie legt die Grenze für die Anzahl der gleichzeitig zugestellten Anfragen fest.
Alle Verbindungsversuche, die das MaxClients Limit überschreiten, werden normalerweise bis zu einer Nummer in die Warteschlange gestellt, die auf der ListenBacklog-Direktive basiert.
Sobald ein untergeordneter Prozess am Ende einer anderen Anforderung freigegeben wird, wird die Verbindung hergestellt.


Die Tatsache, dass zwei Clients dieselbe Seite anfordern, ist kein Problem.

So :

Werden die Anfragen in die Warteschlange gestellt?

Nein ; außer wenn :

  • Irgendwo gibt es eine Sperre - was beispielsweise passieren kann, wenn die beiden Anforderungen vom selben Client stammen und Sie dateibasierte Sitzungen in PHP verwenden : Während ein Skript ausgeführt wird, ist die Sitzung "gesperrt" bedeutet, dass der Server / Client warten muss, bis die erste Anforderung abgeschlossen (und die Datei entsperrt ) ist, um die Sitzung zum Öffnen der Sitzung für den zweiten Benutzer verwenden zu können.
  • Die Anforderungen kommen vom selben Client UND vom selben Browser. Die meisten Browser stellen die Anforderungen in diesem Fall in die Warteschlange, selbst wenn auf der Serverseite dieses Verhalten nicht auftritt.
  • Es gibt mehr als MaxClientsderzeit aktive Prozesse - siehe das Zitat aus dem Apache-Handbuch kurz zuvor.


Werden sie ignoriert?

Nein, dies würde bedeuten, dass nur ein Benutzer gleichzeitig eine Website verwenden kann. das wäre doch nicht ganz schön, oder?

Wenn dies der Fall wäre, könnte ich diese Antwort nicht posten, wenn Sie im selben Moment F5 drücken würden, um zu sehen, ob jemand geantwortet hat!
(Nun, SO ist nicht in PHP, aber die Prinzipien sind die gleichen)


Irgendeine andere Möglichkeit?

Ja ^^


Bearbeiten, nachdem Sie das OP und den Kommentar bearbeitet haben:

Wird jede Anfrage eine eigene Skriptinstanz haben?

Es gibt keine " Skriptinstanz ": Einfach ausgedrückt, was passiert, wenn eine Anforderung an ein Skript gestellt wird, ist:

  • Der Webserver gibt einen anderen Prozess vor , um die Anforderung zu verarbeiten (häufig werden diese Gabeln aus Leistungsgründen im Voraus erstellt, dies ändert jedoch nichts).
  • Der Prozess liest das PHP-Skript von der Festplatte
    • Dies können mehrere Prozesse gleichzeitig tun : Das Lesen von Dateien ist nicht gesperrt
    • Die Datei wird in den Speicher geladen. in einem eigenen Speicherblock für jeden Prozess
  • Die PHP-Datei im Speicher wird zu Opcodes " kompiliert " - noch im Speicher
  • Diese Opcodes werden ausgeführt - immer noch aus dem Speicherblock, der zu dem Prozess gehört, der Ihre Anfrage beantwortet


In Wirklichkeit können zwei Benutzer eine Anfrage an dasselbe PHP-Skript senden (oder an verschiedene PHP-Skripte, die alle dieselbe PHP-Datei enthalten) . Das ist definitiv kein Problem, oder keine der Websites, an denen ich jemals gearbeitet habe, würde funktionieren!

Pascal MARTIN
quelle
Wenn mehrere gleichzeitige Anfragen auf dieselbe PHP-Datei zugreifen, was wäre das Ergebnis? Werden die anderen Anforderungen ausstehend bleiben oder hat jede Anforderung eine eigene Skriptinstanz?
Kevin Boyd
3
Es gibt keine "Skriptinstanz": Jede Anforderung wird von einem bestimmten Prozess (oder Thread) verarbeitet. Die Skripte werden aus dem Speicher / der Festplatte gelesen, aber dieselbe Datei kann problemlos von vielen Prozessen gleichzeitig gelesen werden (zumindest unter "modernen" Betriebssystemen - dh sowohl Windows als auch Linux)
Pascal MARTIN
Dies ist eine hervorragende Antwort. Wo kann ich mehr über die Funktionsweise von PHP erfahren? Irgendein gutes Buch dafür?
Kevin Boyd
1
Das weiß ich nicht wirklich: Ich schätze, ich gehe das Handbuch durch, lese Artikel im Internet, Fragen / Antworten hier und da und arbeite mehrere Jahre mit PHP. Das ist eine gute Möglichkeit zu lernen - aber ich kann ' Ich kann kein Buch empfehlen, das genau erklärt, wie PHP funktioniert. Es gibt einige Informationen in "Erweitern und Einbetten von PHP", aber es geht nicht darum zu erklären, wie PHP funktioniert ;; Vielleicht kann php.net/manual/en/internals2.php helfen?
Pascal MARTIN
Perfektion! Hat mir viel geholfen !
Zookastos
21

Wenn 2 Clients gleichzeitig den Server anrufen, kann der Server höchstwahrscheinlich beide Clients fast gleichzeitig beantworten. Die Clients hier definiere ich auf Browserebene.

Das heißt, wenn Sie auf demselben Computer zwei Browser verwenden, um dieselbe Website / Seite gleichzeitig zu laden, sollten beide gleichzeitig geladen werden.

Da es sich jedoch um PHP handelt, müssen Sie spezielle Notizen zu Sitzungen machen. Wenn Ihre Seiten Sitzungen verwenden, stellt der Server jeweils nur eine Seite bereit. Dies liegt daran, dass die Sitzungsdatei gesperrt wird, bis ein Skript beendet wird.

Schauen Sie sich dieses Beispiel an. Die 2 Dateien werden aus derselben Sitzung geladen, auch bekannt als derselbe Browser und derselbe Benutzer.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Beachten Sie, dass scriptb.php erst gestartet wird, nachdem scripta.php bereitgestellt wurde. Dies liegt daran, dass beim Start von scripta.php die Sitzungsdatei an andere Skripte gebunden ist, damit scripta.php in die Sitzungsdatei schreiben kann. Wenn scripta.php abgeschlossen ist, wird die Sitzungsdatei entsperrt und kann daher von anderen Skripten verwendet werden. Daher wartet scriptb.php, bis die Sitzungsdatei freigegeben ist, sperrt dann die Sitzungsdatei und verwendet sie.

Dieser Vorgang wird immer wieder wiederholt, um zu verhindern, dass mehrere Skripte in dieselbe Sitzungsdatei schreiben und Verzögerungen verursachen. Daher wird empfohlen, session_write_close() aufzurufen, wenn Sie die Sitzung nicht mehr verwenden, insbesondere auf einer Website mit vielen Iframes oder AJAX.

Mauris
quelle
4

Bin gerade selbst darauf gestoßen. Grundsätzlich müssen Sie anrufen session_write_close(), um das Sperren einzelner Benutzer zu verhindern. Stellen Sie nach dem Aufruf sicher, dass Sie session_write_close()keine Sitzungsvariablen ändern. Behandeln Sie Sitzungen von nun an als schreibgeschützt.

Justin
quelle
3

Sofern Sie kein sehr standardmäßiges Setup ausführen, verfügt Ihr Webserver (Apache, IIS, Nginx usw.) über mehrere Prozesse, auf denen PHP für jede auf dem Server eingehende Anforderung separat ausgeführt wird. Gleichzeitige Anfragen werden gleichzeitig bearbeitet.

conceptDawg
quelle