Kann WordPress zur Unterstützung von Websockets erstellt werden?

17

Websockets sind eine coole, innovative Technologie, die in HTML5 integriert ist. Grundsätzlich können Sie ein Websocket öffnen, um eine dauerhafte bidirektionale Kommunikation mit einem Webserver zu ermöglichen. Der Client (Benutzeroberfläche) kann spontan Nachrichten senden, und der Server kann auch Nachrichten senden.

Bei vorhandener Technologie (JavaScript) muss alles vom Client gestartet werden. Der Server kann nichts an den Client senden, was der Client nicht angefordert hat. Skripte müssen daher ständig aktualisiert werden und Daten erneut anfordern, die sich möglicherweise nicht geändert haben. Websockets arbeiten mehr auf " Push " -Basis und lassen neue Daten immer wieder auf die Pipe.

Leider erfordern die meisten (ohnehin alles, was ich finden kann) Websocket-Implementierungen eine bestimmte Serveranwendung, um zu funktionieren. Die Benutzer führen Apache auf den Ports 80 und 443 (http und https) und ein anderes System (normalerweise Node.js) auf einem anderen Port (dh 8000 oder 8080) aus, um Websocket-Anforderungen zu verarbeiten.

Das funktioniert natürlich, hat aber einige Nachteile.

Ich möchte ein Plugin erstellen, das von der Verwendung von Websockets in WordPress sehr profitiert. Wenn ein Benutzer jedoch einen zweiten Webserver installieren muss (normalerweise nicht für Benutzer mit Shared Hosting), funktioniert er nicht als Plugin.

Wie würden Sie für jeden von Ihnen, der Erfahrung hat, WordPress mit Websockets kompatibel machen? Würden Sie WordPress dazu bringen, die Kommunikation selbst zu verwalten, oder ein anderes Miniserver-Skript in das Plugin einbinden? Wenn Sie dies bereits getan haben, wie haben Sie es erreicht, ohne WordPress selbst zu beschädigen?

Mögliche Ressourcen?


21.09.11 Update

Angesichts der Tatsache, dass Apache (der am häufigsten installierte Server für die Ausführung von WP auf einem gemeinsam genutzten Host) Web-Sockets nicht nativ verarbeiten kann, frage ich mich, ob es eine Alternative gibt. Mehrere Plugins (z. B. JetPack) kommunizieren mit einem externen Dienst oder einer API, um Inhalte zu generieren.

Stats fordert Inhalte von Automattic an. Akismet sendet Daten von einem externen Server hin und her. Nach Ablauf der Frist werden Inhalte zum Zeitpunkt der Veröffentlichung eingereicht. Einige SEO-Tools leiten die Dinge über externe Systeme hin und her.

Wäre es also als Alternative zur Unterbringung des Websocket-Codes in einem WordPress-Plugin denkbar, einen Websocket-Dienst an einem zentralen Ort zu hosten und stattdessen ein WordPress-Frontend damit zu interagieren?

EAMann
quelle
3
Fazit: Wenn Websockets mit dem nativen Webserver nicht gut funktionieren, können Sie dies mit diesem Webserver nicht einfach tun. Dies ist kein WordPress-spezifisches Problem. Wie Sie bereits sagten, benötigen Websockets in der Regel einen separaten Server wie node.js oder etwas anderes. Sie werden mit Apache überhaupt nicht gut funktionieren. Ihr Problem ist also nicht "wie mache ich es kompatibel mit WordPress", sondern "wie bekomme ich es auf Hosting mit dem kleinsten gemeinsamen Nenner zum Laufen", was ein ganz anderer Fischkessel ist.
Otto
Die WebSocket-Unterstützung könnte zu WordPress Core hinzugefügt werden, mit einem eingebauten WebSocket-Server und einem Endpunkt wie admin-ajax.php, nicht wahr? Es gibt auch die JavaScript-Frontend / Node.js-Backend-Bibliothek Socket.IO für WebSocket mit Polling als Fallback, die von Automattic, dem Unternehmen hinter WordPress, entwickelt wurde.
Taufe

Antworten:

7

WebSockets verwenden das websockets-Protokoll: WS: /example.com/yourscript.js und öffnen eine synchrone Verbindung. Dies bedeutet, dass die Verbindung offen und für den Browser reserviert gehalten wird.

httpd-Server wie apache2 (von den meisten gemeinsam genutzten Hosting-Anbietern verwendet) verwenden das http-Protokoll: http://example.com/yourscript.jsund öffnen eine asynchrone Verbindung. Dies bedeutet, dass keine Verbindung zwischen dem Server und dem Browser hergestellt wird. (Sie können offene Verbindungen in bescheidenem Umfang verlängern, indem Sie bestimmte Konfigurationsparameter festlegen. Im Allgemeinen ist dies jedoch asynchron.)

Wie Sie sich vorstellen können, werden durch das Aufrechterhalten offener Verbindungen zwischen dem Browser und dem Server mehr Serverressourcen für jede Browserverbindung reserviert, und die Serverressourcen werden daher stärker beansprucht, als wenn Verbindungen nach jeder Anforderung getrennt werden. Shared Hosting-Anbieter sind verständlicherweise nicht bereit, WS bei Shared Hosting zu unterstützen.

Während auf bestimmten freigegebenen Hosts möglicherweise mod_python installiert ist, sodass Ihre Plugin-Benutzer pywebsocket ausführen können , heißt es in der pywebsocket-eigenen Dokumentation eindeutig, dass "pywebsocket für Test- oder Versuchszwecke gedacht ist".

Obwohl man sich vorstellen kann, dass ein Plugin Python-Code bündelt, um einen Pywebsocket-Server zu erstellen, halte ich es bei einem Apache-Server, der diesen unterstützt, nie für sinnvoll, ein Plugin zu verbreiten, das dies tut.

Marfarma
quelle
Es gibt einige reine PHP-Bibliotheken, die behaupten, Websockets zu unterstützen. Es wäre ein interessanter Test, ob sie in Apache effektiv funktionieren oder nicht. Siehe mein Update für Links ...
EAMann
3

Als Reaktion auf Ihr Update wäre dies meiner Meinung nach und basierend auf den von mir durchgeführten Untersuchungen die beste Option. Noch besser wäre es, das Front-End-Plugin und den externen Websocket-Service zu erstellen, um mit den Plugins zu kommunizieren, und eine Gebühr dafür zu erheben, damit Sie Ihre Idee monetarisieren können, wenn Sie möchten. Sie können sogar den Quellcode für den Websocket-Dienst bereitstellen und eine Einstellung im Plugin erstellen, um festzulegen, wo (welche Domain / IP und welcher Port) sich der Websocket-Dienst befindet.

user15143
quelle
2

Vergessen Sie zu diesem Zweck den "klassischen" Apache2 - Apache2-MPM-Prefork. Vielleicht könnte apache2-mpm-event damit umgehen, aber es ist experimentell. Da Apache2 nicht ereignisgesteuert ist, besteht das von @marfarma beschriebene Problem. Für diese Art der Bereitstellung benötigen Sie einen ereignisgesteuerten Webserver, z. B. Cherokee oder Nginx.

nginx kann ein echter Vorteil für WordPress sein (da es von wordpress.com auch als Server verwendet wird), und es kann beispielsweise bestimmte Anfragen an einen node.js-Dienst weiterleiten.

Einige Beispiele im Thema:

Ich habe auch ein kleines Tutorial für nginx + php-fpm + wordpress setup erstellt .

petermolnar
quelle
Den "klassischen" Ansatz zu vergessen, ist keine Option, um ein einfach zu installierendes Plugin für Laien zu erstellen. Ja, es ist eine Option, nginx, cherokee oder node.js zu verwenden, um Dinge vom Server aus zu bedienen, aber Sie können dies nicht einfach in eine Plug-in-Readme-Datei schreiben und hoffen, dass Benutzer a) es verstehen oder b) irgendetwas dagegen tun können es.
EAMann,
apache2-mpm-prefork wurde nicht dafür entwickelt, diese Art der Nutzung zu bewältigen. Es gibt Plugins, für die Memcached, APC usw. erforderlich sind. Daher ist möglicherweise nur ein ereignisbasierter Webserver erforderlich. Dies ist eine Backend-Anforderung, mpm-prefork und mpm-worker nicht.
Petermolnar
1

Eine andere mögliche Lösung ist die Verwendung eines Web-Sockets-Anbieters von Drittanbietern. Ich habe ein bisschen mit Pusher (http://pusher.com/) herumgespielt. Es gibt eine API, auf die Sie zugreifen können, die möglicherweise für Ihre Zwecke gut funktioniert versuchen es zu tun. Ich habe darüber nachgedacht, wie ich es in meinen eigenen WordPress-Sites nutzen könnte.

Ein möglicher Nachteil ist, dass andere Benutzer, die versuchen, Ihr Plugin zu verwenden, ebenfalls ein Pusher-Konto benötigen, damit es funktioniert. Es ist viel einfacher, damit zu arbeiten, als einen eigenen Web-Sockets-Server zu installieren und warten zu müssen. Dies wäre tatsächlich ein Vorteil, wenn andere versuchen, Ihr Plugin zu verwenden.

Rick Curran
quelle
0

Die kurze Antwort lautet: Ja, es ist machbar. Ich könnte etwas verteilteres untersuchen als einen einzelnen VPS-Fehlerpunkt, den Sie hosten. Vielleicht in einige lastausgeglichene EC2-Systeme schauen oder so? (Ich gehe davon aus, dass Sie eine Einnahmequelle für solche Annehmlichkeiten haben. Grinsen )

ZaMoose
quelle
1
"eine Einnahmequelle für solche Annehmlichkeiten" ... das wäre schön :-)
EAMann