können Sie mir sagen, wie Server verschiedene http-Anfrage auf einmal behandelt. Wenn sich 10 Benutzer gleichzeitig bei einer Site anmelden und gleichzeitig eine Anfrage für eine Seite senden, was wird passieren?Wie kann der Server die verschiedenen Benutzeranforderungen gleichzeitig verwalten?
Antwort
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
Apache 2 hat zwei unterschiedliche Betriebsarten. Einer läuft als threaded server der andere benutzt einen Modus namens "prefork" (multiple processes).
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.
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.
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.
- 1. Wie mehrere run_forever Handler gleichzeitig zu verwalten?
- 2. Daten verwalten, die vom Server
- 3. Wie verwalten Sie die Root-Passwörter der Server?
- 4. Wie kann ich die Verwendung einer freigegebenen Ressource verwalten, die von mehreren Perl-Programmen verwendet wird?
- 5. Wie kann ich meine Website gleichzeitig auf verschiedenen Servern hochladen?
- 6. kann ich Datenbank auf verschiedenen sql-Instanzen gleichzeitig anhängen?
- 7. Verwalten der SQL Server-Erweiterung .LDF-Datei
- 8. Verwalten von Client-Server
- 9. Zwei Versionen einer Anwendung gleichzeitig verwalten und bereitstellen
- 10. Wie kann ich 2 Server gleichzeitig in Python ausführen?
- 11. iphone: Verwalten von Timern auf verschiedenen Ansichten
- 12. Verwalten von gleichzeitigen Projekten in verschiedenen Programmiersprachen
- 13. Java Modifizieren Liste gleichzeitig an verschiedenen Orten
- 14. Wie kann ich Verbindungen zu verschiedenen Datenbanken innerhalb eines Transaktionsbereichs verwalten?
- 15. Wie öffentliche APIs die Lasten verwalten?
- 16. Verwalten von SQL Server-Verbindungen
- 17. Mit zwei verschiedenen Popup-Styles gleichzeitig
- 18. IntelJ: 2 Anwendungen gleichzeitig mit verschiedenen Port
- 19. Java mp3s gleichzeitig in verschiedenen Lautstärken abspielen
- 20. Wie starte ich zwei Animationen gleichzeitig auf verschiedenen Aktivitäten
- 21. Quelle gleichzeitig unter git und svn verwalten - macht es Sinn?
- 22. Wie kann ich einen Fork-Pool in Perl verwalten?
- 23. Wie eine Datei an verschiedenen Orten kopieren gleichzeitig
- 24. Wie verwalten Sie die Protokollierungsleistung?
- 25. SQL Server: Wie kann ich die Datenintegrität mithilfe von Aggregatfunktionen mit Gruppen verwalten?
- 26. Wie authentifiziere ich mich gleichzeitig an 2 verschiedenen symfony2 Firewalls?
- 27. Wie kann ich OSGi Build-Abhängigkeiten verwalten?
- 28. Wie Sie die Anzahl der gleichzeitig ausgeführten PBS-Jobs begrenzen
- 29. Wie innen Sync-Task Anzahl der Threads verwalten
- 30. Wie kann ich die Höhe von androiden Spinner Artikeln verwalten?