2010-06-03 5 views

Antwort

6

Normalerweise sendet jeder der Benutzer eine HTTP-Anforderung für die Seite. Der Server empfängt die Anforderungen und delegiert sie an verschiedene Worker (Prozesse oder Threads).

Abhängig von der angegebenen URL liest der Server eine Datei und sendet sie an den Benutzer zurück. Wenn die Datei eine dynamische Datei wie eine PHP-Datei ist, wird die Datei ausgeführt, bevor sie an den Benutzer zurückgesendet wird.

Sobald die angeforderte Datei zurückgeschickt wurde, schließt der Server die Verbindung normalerweise nach einigen Sekunden.

Weitere finden Sie unter: HowStuffWorks Web Servers

0

Die Anfragen werden gleichzeitig verarbeitet, um die beste Fähigkeit des HTTP-Daemon.

Normalerweise erzeugt der HTTP-Daemon entweder mehrere Prozesse oder mehrere Threads und jeder wird eine Client-Anfrage bearbeiten. Der Server behält möglicherweise zusätzliche Threads/Prozesse bei, so dass ein Client, wenn er eine Anforderung stellt, nicht auf die Erstellung des Threads/Prozesses warten muss. Jeder Thread/Prozess kann einem anderen Prozessor oder Kern zugeordnet werden, so dass sie schneller verarbeitet werden können. In den meisten Fällen sind jedoch die Anforderungen an die Netzwerk-E/A, nicht an mangelnde Rechenleistung, so dass es häufig nicht zu einer Verlangsamung kommt, wenn die Anzahl der Prozessoren/Kerne wesentlich geringer ist als die Anzahl der gleichzeitig bearbeiteten Anfragen.

2

HTTP verwendet TCP, die ein verbindungsbasiertes Protokoll ist. Das heißt, Clients stellen eine TCP-Verbindung her, während sie mit dem Server kommunizieren.

Mehrere Clients dürfen sich gleichzeitig auf demselben Zielcomputer mit demselben Zielport verbinden. Der Server öffnet nur mehrere gleichzeitige Verbindungen.

Apache (und die meisten anderen HTTP-Server) haben ein Multi-Processing-Modul (MPM). Dies ist verantwortlich für die Zuordnung von Apache-Threads/-Prozessen zur Verarbeitung von Verbindungen. Diese Prozesse oder Threads können dann parallel auf ihrer eigenen Verbindung laufen, ohne sich gegenseitig zu blockieren. Das MPM von Apache neigt auch dazu, "freie" Threads oder Prozesse offen zu halten, selbst wenn keine Verbindungen offen sind, was nachfolgende Anfragen beschleunigt.

Das Programm ab (kurz für ApacheBench), das mit Apache geliefert wird, können Sie testen, was passiert, wenn Sie mehrere Verbindungen zu Ihrem HTTP-Server auf einmal öffnen.

Apache-Konfigurationsdateien legen normalerweise eine Grenze für die Anzahl der gleichzeitigen Verbindungen fest, die akzeptiert werden. Dies wird auf eine vernünftige Anzahl eingestellt, so dass diese Grenze während des normalen Betriebs niemals erreicht werden sollte.

Hinweis zu, dass das HTTP-Protokoll (ab Version 1.1) ermöglicht eine Verbindung offen gehalten werden, so dass der Client mehr HTTP-Anforderungen machen kann, bevor die Verbindung geschlossen wird, möglicherweise die Anzahl der gleichzeitigen Verbindungen zu reduzieren sie benötigen, um zu machen.

Mehr auf Apache MPMs:

Apache selbst kann eine Reihe von verschiedenen Multi-Processing-Module (MPM) verwenden. Apache 1.x verwendet normalerweise ein Modul namens "prefork", das im Vorfeld eine Reihe von Apache-Prozessen erstellt, so dass eingehende Verbindungen oft an einen bestehenden Prozess gesendet werden können. Dies ist wie oben beschrieben.

Apache 2.x verwendet normalerweise ein MPM namens "worker", das multithreading (das Ausführen mehrerer Ausführungsthreads innerhalb eines einzelnen Prozesses) verwendet, um dasselbe zu erreichen. Der Vorteil des Multithreading über separate Prozesse besteht darin, dass das Threading im Vergleich zum Öffnen separater Prozesse sehr viel leichter ist und sogar weniger Speicher benötigt. Es ist sehr schnell.

Der Nachteil von Multithreading ist, dass Sie Dinge wie mod_php nicht ausführen können. Wenn Sie Multithreading durchführen, müssen alle Ihre Add-In-Bibliotheken "Thread-sicher" sein - das heißt, sie müssen darauf achten, dass sie in einer Multithread-Umgebung ausgeführt werden. Es ist schwieriger, eine Multithread-Anwendung zu schreiben. Da Threads innerhalb eines Prozesses einige Arbeitsspeicher/Ressourcen zwischen ihnen teilen, kann dies leicht zu Racebeding-Bugs führen, bei denen Threads Lese- oder Schreibvorgänge in den Speicher ausführen, wenn ein anderer Thread gerade daran schreibt. Herumkommen erfordert Techniken wie . Viele der in PHP integrierten Bibliotheken sind nicht threadsicher, sodass diejenigen, die mod_php verwenden möchten, das Apache-MPM "Worker" nicht verwenden können.

0

Der Server (Apache) ist multi-threaded, was bedeutet, dass es mehrere Programme gleichzeitig ausführen kann. Vor einigen Jahren konnte eine einzelne CPU schnell zwischen mehreren Threads hin- und herschalten, was dazu führte, dass zwei Dinge auf einmal passierten. Heutzutage haben Computer mehrere Prozessoren, so dass der Computer tatsächlich zwei Threads gleichzeitig ausführen kann. Allerdings werden Threads nicht wirklich auf einfache Weise auf Prozessoren abgebildet.

Mit dieser Fähigkeit kann ein PHP-Programm als ein einziger Thread der Ausführung gedacht werden. Wenn zwei Anfragen gleichzeitig den Server erreichen, können zwei Threads verwendet werden, um die Anfrage gleichzeitig zu bearbeiten. Sie werden wahrscheinlich beide die gleiche Menge an CPU bekommen, wenn sie also dasselbe machen, werden sie ungefähr zur gleichen Zeit fertig sein.

Eines der häufigsten Probleme mit Multi-Threading ist "Race Conditions" - wo Sie zwei Anfragen dasselbe tun ("racing", um das gleiche zu tun), wenn es eine einzige Ressource ist, eine davon Sie werden gewinnen. Wenn beide einen Datensatz in die Datenbank einfügen, können sie nicht beide die gleiche ID erhalten - einer von ihnen wird gewinnen. Sie müssen also vorsichtig sein, wenn Sie Code schreiben, um zu erkennen, dass andere Anfragen gleichzeitig ablaufen und Ihre Datenbank verändern, Dateien schreiben oder globale Variablen ändern können.

Das Programmiermodell erlaubt es Ihnen, diese Komplexität weitgehend zu ignorieren.

Verwandte Themen