Wie Apache PHP für Seiten ausführt [geschlossen]

8

Stellen Sie sich vor, es gibt eine PHP-Seite auf http://server/page.php .

Client (s) senden 100 Anfragen vom Browser gleichzeitig an den Server für diese Seite.

Führt der Server 100 separate Prozesse von php.exe gleichzeitig aus?

Interpretiert es page.php 100 mal neu?

    
Meysam Hit 01.06.2013, 15:36
quelle

4 Antworten

10

Die Antwort ist sehr variabel, je nach Serverkonfiguration.

Lassen Sie uns zuerst Frage 1 beantworten:

  

Führt der Server 100 separate Prozesse von php.exe gleichzeitig aus?

Dies hängt davon ab, wie PHP installiert ist. Wenn PHP über CGI ausgeführt wird, lautet die Antwort "Ja, jede Anfrage ruft eine separate Instanz von PHP auf". Wenn es über ein Apache-Modul ausgeführt wird, lautet die Antwort "Nein, jede Anfrage startet einen neuen PHP-Thread innerhalb der ausführbaren Apache-Datei".

Ähnliche Variationen gibt es für andere Webserver. Bitte beachten Sie, dass für ein Unix / Linux-basiertes Betriebssystem das Ausführen separater Kopien der ausführbaren Datei für jede Anforderung nicht unbedingt eine schlechte Leistung ist. Der Kern des Betriebssystems ist so konzipiert, dass Aufgaben in vielen Fällen besser durch eine Reihe separater ausführbarer Dateien als durch eine einzige ausführbare Datei erledigt werden können.

Unabhängig davon, was Sie dagegen tun, führt eine große Anzahl von gleichzeitigen Anfragen zu einer Entlastung Ihrer Serverressourcen und zu Zeitüberschreitungen und Fehlern für Ihre Benutzer. Aus diesem Grund ist es wichtig, dass Ihre PHP-Programme so schnell wie möglich fertig sind. Schreiben Sie keine PHP-Programme für den Web-Verbrauch, die langsam laufen; Wenn Sie sehr viel Traffic haben, müssen Sie genauso auf Leistung testen wie auf Funktionalität. Wenn Ihre Programme schnell beendet werden, wird die Wahrscheinlichkeit, dass eine große Anzahl gleichzeitiger Anfragen auftreten, drastisch reduziert, was sich natürlich stark auf die Leistung Ihrer Website auswirkt.

Nun Ihre zweite Frage:

  

Wird die page.php 100 Mal neu interpretiert?

Bei einer Standard-PHP-Installation lautet die Antwort hier: "Ja, das tut es, und ja, es hat Auswirkungen auf die Leistung."

Allerdings bietet PHP mehrere Caching-Lösungen, die speziell dafür entwickelt wurden, dies zu mildern. Die Hauptoptionen sind APC und der Zend Cache, die beide als Standardmodule installiert werden können. Die Verwendung dieser Module bedeutet, dass PHP den interpretierten Code zwischenspeichert, so dass er für nachfolgende Aufrufe viel schneller ausgeführt werden kann.

Der Zend Cache wird ab der kommenden Version PHP 5.5 als Teil der PHP-Standardinstallation enthalten sein.

    
Spudley 01.06.2013, 16:08
quelle
3

Apache2 hat mehrere verschiedene Modi zu arbeiten.

Im Modus "prefork" (der am häufigsten verwendete Modus) erstellt Apache einen Prozess für jede Anfrage, jeder Prozess führt eine eigene php.exe aus. Config Datei wird eine maximale Anzahl von Verbindungen zuweisen ( MaxClients in httpd.conf), Apache erstellt nur MaxClients. Dies dient dazu, Speichererschöpfung zu verhindern. Weitere Anfragen werden in die Warteschlange gestellt und warten auf die Beendigung der vorherigen Anfrage.

Wenn Sie keine Opcode-Cache-Erweiterungen wie APC, XCache, eAccelerator installieren, interpretiert php.exe die page.php 100-mal neu.

    
jysperm 01.06.2013 16:02
quelle
1

Kommt darauf an.

Es gibt verschiedene Möglichkeiten, Dinge einzurichten, und die Dinge können sehr komplex werden.

Die kurze Antwort ist "mehr oder weniger". Eine Reihe von Apache-Prozessen wird hervorgebracht, der PHP-Code wird analysiert und ausgeführt.

Wenn Sie den Parsing-Overhead vermeiden möchten, verwenden Sie einen Opcode-Cache. APC (Alternative PHP Cache) ist sehr beliebt. Dies hat eine Reihe von nützlichen Funktionen, die es wert sind, zu erforschen, aber ohne irgendeine Konfiguration außer der Installation wird es sicherstellen, dass jede PHP-Seite nur einmal in Opcode geparst wird.

Um zu ändern, wie viele Apacheservices erzeugt werden, verwenden Sie höchstwahrscheinlich MPM Prefork . Auf diese Weise können Sie entscheiden, wie Apache mit mehreren Benutzern umgehen soll.

Nach meiner Erfahrung (kleine Sites, nicht sehr viel Traffic) ist die Installation von APC eine gute Sache, für alles andere sind die Standardeinstellungen nicht zu schlecht.

    
Rich Bradshaw 01.06.2013 16:01
quelle
1

Darauf gibt es eine Reihe von Antworten. Im Allgemeinen erstellt Apache einen Prozess für eine eingehende Anfrage, daher ist es möglich, dass 100 Prozesse erstellt werden. Ein Prozess braucht jedoch Zeit, um zu erstellen. Wenn also ein Prozess beendet und abgestorben ist, kommt eine dieser 100 Verbindungen in einem Bruchteil einer Sekunde später (seit 100 Verbindungen bei genau ) die gleiche Zeit ist in der Tat sehr selten, es sei denn, Sie sind Google).

Stellen wir uns jedoch vor, dass 100 Prozesse wirklich gleichzeitig im Speicher gehalten werden müssen, aber dass im verfügbaren Server-RAM nur Platz für 50 zur Verfügung steht. In diesem Fall werden 50 Verbindungen bedient, und 50 müssen warten, bis die Prozesse beendet sind und neu generiert werden. Somit wird eine zufällige Hälfte dieser Anfragen verzögert, obwohl, wenn eine Prozess-Erstellprozess-Die-Sequenz nur einen Bruchteil einer Sekunde dauert, sie nicht sehr lange warten müssen. Aus diesem Grund ist es bei der Verbesserung der Serverkapazität genauso wichtig, die Ladezeit von Seiten zu reduzieren, wie das Hinzufügen von mehr RAM - je früher ein Prozess abgeschlossen wird, desto früher kann ein neuer Platz eingenommen werden.

Eine Möglichkeit, die Ladezeit zu reduzieren, besteht übrigens darin, eine Reihe von PHP-Prozessen zu erzeugen und im Speicher zu halten. Dies ist die Grundlage von FastCGI (oder fcgid, das kompatibel ist). Anstatt einen Prozess für jede Anforderung zu erstellen und zu beenden, wird ein Prozess sofort im Speicher generiert und für mehrere Anforderungen wiederverwendet. Bei PHP werden diese normalerweise so konfiguriert, dass sie nach einer bestimmten Anzahl von Seitenanforderungen (z. B. 1000) abstürzen, da PHP in der Vergangenheit ziemlich viele Speicherlecks aufwies (je mehr ein Prozess wiederverwendet wird, desto schlechter werden die Speicherlecks) >

Sie fragen, ob eine Seite für jede Anfrage neu interpretiert wird. Normalerweise ja, aber wenn Sie auch einen PHP Accelerator ausführen, dann nein - der Byte-Code, den PHP kompiliert, wird zwischengespeichert und wiederverwendet. Daher kann das Mischen des FastCGI-Ansatzes mit einem Beschleuniger tatsächlich zu einem sehr schnellen Server führen. Standard-PHP ist nicht mit einem Accelerator ausgestattet, aber Zend Cache ist für die Einbindung in den PHP-Kern geplant .

    
halfer 01.06.2013 16:00
quelle

Tags und Links