8 Stimmen

Wie kann ich das c10k-Problem angehen, wenn ich PHP verwende?

Ich entscheide mich für die Architektur einer Anwendung, bei der "Http KeepAlive" und "Long Polling" für schnellere Antworten verwendet werden. Gibt es etwas für PHP, das das Problem löst, das Tornado für c10k löst?

Ich dachte daran, nginx + PHP-FPM zu verwenden. Aber dann gibt es für 1000 aktive Verbindungen nicht 1000 PHP-FPM-Prozesse?

Dann denke ich, dass wir das gleiche Problem haben werden wie Apache mit vielen stehenden Verbindungen. Oder nicht?

BEARBEITEN: Ich verstehe, dass nginx ausreichen wird, wenn ich nur HTTP KeepAlive haben möchte. Aber was ist, wenn ich auch Long Polling wie Tornado unterstützen möchte? Gibt es etwas Ähnliches in PHP?

6voto

Emil Vikström Punkte 87499

Für aktive Verbindungen (also das Laden und Ausführen eines definierten PHP-Skripts) gibt es ja so viele PHP-Prozesse wie aktive Verbindungen. Aber KeepAlive betrifft passive Verbindungen, und Nginx ist sehr gut darin, passive KeepAlive-Verbindungen mit sehr geringer Ressourcennutzung zu behandeln - selbst bei Tausenden davon.

Das Problem bei Apache ist, dass es in der üblichen Konfiguration mit mod_php und mpm_prefork für jede Verbindung einen Prozess benötigt, selbst wenn es sich nur um eine passive KeepAlive-Verbindung handelt. Das bedeutet, dass die meisten Apache-Server tatsächlich einen PHP-Prozess im Speicher haben müssen, selbst wenn die Verbindung passiv ist. Dies ist jedoch nicht der Fall, wenn Sie PHP als FastCGI ausführen. Apache kann auch viele passive Verbindungen verarbeiten, wenn Sie PHP als FastCGI ausführen und mpm_worker wählen, der für jede Verbindung einen leichtgewichtigen Thread erstellt, aber es ist immer noch nicht so gut wie Nginx.

3voto

RobertPitt Punkte 55763

Meine Antwort darauf wäre, sich node.js anzusehen. Sie geben an, dass Node.js 100K aktive Verbindungen problemlos verarbeiten sollte, solange Sie die richtige Hardware haben.

Node spawniert keine neuen Prozesse, wenn eine Verbindung hergestellt wird, der Socket wird in ein Warteschlangensystem platziert, aber es ist kein typisches Warteschlangensystem, bei dem eine Verbindung verarbeitet wird und dann die nächste.

Node.js ist bekannt dafür, viele Verbindungen zu verarbeiten und ihre HTTP-Client-Bibliothek basiert auf dem Keep-Alive-Stil des Datentransfers, außerdem ist sie sehr schnell und leistungsstark.

Ich habe es viel benutzt und ich muss sagen, es ist extrem einfach zu benutzen, es basiert auf dem super schnellen Google V8 Engine, der für JavaScript in Chrome verwendet wird, was bedeutet, dass es extrem schnell ist. Sie sollten sich das wirklich ansehen und sehen, dass es für diese Art von Dingen geeignet ist.

0voto

dynamic Punkte 45516

Ich verstehe nicht, was du meinst. die c10k ist mit Web-Servern (Apache, Nginx usw.) verbunden und nicht mit PHP.

Wenn du nginx verwendest, solltest du dir keine Sorgen machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X