Ich habe überlegt, Echtzeit-Chat mit einem PHP-Backend zu implementieren, bin aber auf diesen Kommentar auf einer Website gestoßen, auf der es um Kometen geht:
Mein Verständnis ist, dass PHP eine schreckliche Sprache für Comet ist, da Comet erfordert, dass Sie eine dauerhafte Verbindung zu jedem Browser-Client aufrechterhalten. Bei Verwendung von mod_php bedeutet dies, dass für jeden Client, der überhaupt nicht skaliert, ein Apache-Kind in Vollzeit gebunden wird. Die Leute, die ich kenne, die Comet-Sachen machen, verwenden meistens Twisted Python, das für Hunderte oder Tausende gleichzeitiger Verbindungen ausgelegt ist.
Ist das wahr? Oder kann es konfiguriert werden?
Antworten:
Ich stimme nicht zu, dass FastCGI das Problem lösen wird.
Apache
Jede Anforderung an Apache verwendet einen Arbeitsthread, bis die Anforderung abgeschlossen ist. Dies kann für COMET-Anforderungen eine lange Zeit in Anspruch nehmen.
In diesem Artikel über Ajaxian wird erwähnt, dass COMET unter Apache verwendet wird und dass dies schwierig ist. Das Problem ist nicht PHP-spezifisch und gilt für alle Back-End-CGI-Module, die Sie möglicherweise für Apache verwenden möchten.
Die vorgeschlagene Lösung bestand darin, das MPM-Modul "Ereignis" zu verwenden, mit dem die Art und Weise geändert wird, in der Anforderungen an Arbeitsthreads gesendet werden.
Leider funktioniert das auch nicht, da es erst nach Abschluss einer Anfrage "schlummert" und auf eine neue Anfrage vom Client wartet.
PHP
Wenn Sie nun die andere Seite des Problems betrachten, benötigen Sie auch dann einen PHP-Thread pro Anforderung, wenn Sie das Problem mit dem Halten eines Threads pro Kometenanforderung beheben. Aus diesem Grund hilft FastCGI nicht weiter.
Sie benötigen so etwas wie Fortsetzungen, mit denen die Kometenanforderungen wieder aufgenommen werden können, wenn das Ereignis beobachtet wird, durch das sie ausgelöst werden. AFAIK, das ist in PHP nicht möglich. Ich habe es nur in Java gesehen - siehe den Apache Tomcat-Server .
Bearbeiten:
Es gibt hier einen Artikel über die Verwendung eines Load Balancers ( HAProxy ), mit dem Sie sowohl einen Apache-Server als auch einen Kometen-fähigen Server (z. B. Jetty, Tomcat für Java) auf Port 80 desselben Servers ausführen können.
quelle
Sie können Nginx und JavaScript verwenden, um ein Comet-basiertes Chat-System zu implementieren, das mit wenig Speicher- oder CPU-Auslastung sehr skalierbar ist.
Ich habe hier ein sehr einfaches Beispiel, mit dem Sie beginnen können. Es behandelt das Kompilieren von Nginx mit dem NHPM-Modul und enthält Code für einfache Publisher- / Subscriber-Rollen in jQuery, PHP und Bash.
http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/
quelle
PHP
Ich fand diese lustigen kleinen Screencasts , die einfache Kometen erklären. Als Randnotiz denke ich wirklich, dass dies Ihren Server bei jeder realen Last töten wird. Wenn ich nur ein paar Benutzer habe, würde ich sagen, dass ich mich nur für diese Lösung entscheide. Diese Lösung ist wirklich einfach zu implementieren (Screencasts dauern nur 5 Minuten :)). Aber wie ich bereits sagte, denke ich nicht, dass es für viele gleichzeitige Benutzer gut ist (ich denke, Sie sollten es vergleichen;)), weil:
filemtime()
,Alternativen
Ich denke wirklich, Sie sollten die Alternativen ausprobieren, wenn Sie Kometen- / Langabfragen durchführen möchten. Sie könnten viele Sprachen verwenden, wie zum Beispiel:
Nur eine einfache Google-Suche durchzuführen, zeigt Ihnen viele Alternativen auch PHP (was meiner Meinung nach bei jeder großen Last Ihren Server töten wird).
quelle
mod_php ist nicht die einzige Möglichkeit, PHP zu verwenden. Sie können fastcgi verwenden. PHP muss mit kompiliert werden
--enable-fastcgi
.PHP als FastCGI: http://www.fastcgi.com/drupal/node/5?q=node/10
quelle
Sie können auch https://github.com/reactphp/react ausprobieren
Das Einführungsbeispiel zeigt einen einfachen HTTP-Server, der Port 1337 überwacht:
quelle
Ich habe ein ähnliches Problem. Eine Option, die ich interessant finde, ist die Verwendung eines vorhandenen Comet-Servers wie cometd-java oder cometd-python als Kernnachrichten-Hub. Ihr PHP-Code ist dann nur ein Client für den Comet-Server - er kann wie andere Clients Nachrichten von Kanälen posten oder lesen.
Hier ist ein interessantes Code-Snippet verlinkt: http://morglog.org/?p=22=1 , das einen Teil dieser Methode implementiert (obwohl auch einige Teile des Debug-Codes verteilt sind).
quelle
Ich implementiere derzeit einen skalierbaren PHP Comet-Server mit Socket-Funktionen. Es heißt "Phet" ([ph] p com [et])
Projektseite: http://github.com/Tim-Smart/phet
Kostenlos kostenlos an der Entwicklung teilnehmen. Ich habe es derzeit geschafft, den größten Teil der Serverlogik zu erledigen. Ich muss nur die clientseitigen Aufgaben erledigen.
BEARBEITEN: Kürzlich wurden 'Multithreading'-Funktionen mit der
pcntl_fork
Methode hinzugefügt :)quelle
Es wird Ihnen schwer fallen, Kometen in PHP zu implementieren, nur weil es Single-Threaded ist.
Check out websync On-Demand - der Service kann Sie PHP über serverseitige Publishing integrieren, die schweren gleichzeitige Verbindung Sachen Offloading, und lassen Sie eine Echtzeit - Chat - Anwendung in kürzester Zeit erstellen.
quelle
Für den nginx-Webserver wurde gerade ein neues Modul herausgebracht, das Comet in jeder Sprache, einschließlich PHP, ermöglicht.
http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/
quelle
Sie müssen Ihren eigenen Server in PHP erstellen. Die Verwendung von Apache / mod_php oder sogar fastcgi wird überhaupt nicht skaliert. Ein paar Jahre alt, aber Sie können loslegen:
PHP-Comet-Server: http://sourceforge.net/projects/comet/
quelle
Ich denke, dies ist eher ein Problem, bei dem es ein Problem ist, wenn viele Apache-Threads ständig ausgeführt werden. Das wird mit jeder Sprache existieren, wenn es über Apache genauso funktioniert wie PHP (normalerweise).
quelle