WordPress peut-il être conçu pour prendre en charge les Websockets?


18

Les Websockets sont une technologie cool et de pointe intégrée à HTML5. Fondamentalement, vous pouvez ouvrir une prise Web pour permettre une communication bidirectionnelle persistante avec un serveur Web. Le client (interface utilisateur) peut envoyer spontanément des messages, et le serveur peut également envoyer des messages.

La technologie existante (JavaScript) exige que tout soit démarré par le client - le serveur ne peut rien envoyer au client qu'il n'a pas demandé. Les scripts doivent donc être constamment actualisés et demander de nouveau des données qui n'ont peut-être pas changé. Les Websockets fonctionnent davantage sur une base " push " et permettent aux nouvelles données de descendre à tout moment.

Malheureusement, la plupart (tout ce que je peux trouver, de toute façon) des implémentations Websocket nécessitent une application serveur spécifique pour fonctionner. Les gens exécuteront Apache sur les ports 80 et 443 (http et https) et exécuteront un autre système (généralement Node.js) sur un autre port (par exemple 8000 ou 8080) pour gérer les demandes de socket Web.

Cela fonctionne, bien sûr, mais il a quelques inconvénients.

J'ai un plugin que je veux construire qui bénéficierait grandement de l'utilisation de websockets dans WordPress. Mais si un utilisateur doit installer un deuxième serveur Web (généralement impossible pour les personnes ayant un hébergement partagé), cela ne fonctionnera pas comme un plugin.

Donc, pour ceux d'entre vous qui ont de l'expérience, comment pourriez-vous rendre WordPress compatible avec les websockets? Souhaitez-vous faire WordPress gérer la communication elle-même, ou regrouper un autre script de mini-serveur dans le plugin? Si vous l'avez déjà fait, comment l'avez-vous accompli sans casser WordPress lui-même?

Des ressources possibles?


Mise à jour 21/09/11

Avec toutes les discussions sur la façon dont Apache (le serveur le plus couramment installé pour exécuter WP sur un hôte partagé) ne peut pas vraiment gérer les websockets nativement, je me demande une alternative. Plusieurs plugins (JetPack, par exemple) communiquent avec un service externe ou une API pour générer du contenu.

Stats demande le contenu d'Automattic. Akismet envoie des données dans les deux sens à partir d'un serveur externe. Après la date limite soumet le contenu au moment de la publication. Quelques outils SEO font des va-et-vient via des systèmes externes.

Donc, comme alternative au logement du code websocket dans un plugin WordPress, serait-il possible d'héberger un service websocket dans un emplacement central et d'avoir un frontend WordPress interagir avec cela à la place?


3
La conclusion est la suivante: si les Websockets ne fonctionnent pas bien avec le serveur Web natif, vous ne pouvez pas le faire facilement avec ce serveur Web. Ce n'est pas un problème spécifique à WordPress. Comme vous l'avez dit, les websockets nécessitent généralement un serveur séparé comme node.js ou quelque chose, ils ne fonctionneront pas très bien avec Apache. Donc, votre problème n'est pas de "comment le rendre compatible avec WordPress", mais de "comment le faire fonctionner sur l'hébergement au plus petit dénominateur commun", ce qui est une toute autre marmite de poisson.
Otto

La prise en charge de WebSocket pourrait être ajoutée au noyau WordPress, avec un serveur WebSocket intégré et un point de terminaison comme admin-ajax.php, non? Il existe également la bibliothèque de backend JavaScript / Node.js Socket.IO pour WebSocket avec interrogation comme solution de rechange, qui est développée par Automattic, la société derrière WordPress.
baptx

Réponses:


8

Les WebSockets utilisent le protocole websockets: WS: /example.com/yourscript.js et ouvrent une connexion synchrone - ce qui signifie que la connexion est maintenue ouverte et dédiée au navigateur.

Les serveurs httpd, comme apache2 (utilisé par la plupart des hébergeurs partagés) utilisent le protocole http: http://example.com/yourscript.jset ouvrent une connexion asynchrone - ce qui signifie qu'aucune connexion n'est maintenue ouverte entre le serveur et le navigateur. (Vous pouvez prolonger modestement les connexions ouvertes en définissant certains paramètres de configuration - mais en règle générale, c'est asynchrone.)

Comme vous pouvez l'imaginer, le maintien de connexions ouvertes entre le navigateur et le serveur consacre plus de ressources de serveur à chaque connexion de navigateur, et est donc plus taxant les ressources du serveur que la suppression des connexions après chaque demande. Les hébergeurs mutualisés sont naturellement peu enclins à prendre en charge WS sur l'hébergement mutualisé.

Bien que certains hôtes partagés puissent avoir installé mod_python, permettant ainsi aux utilisateurs de votre plugin d'exécuter pywebsocket , la propre documentation de pywebsocket indique clairement que "pywebsocket est destiné à des fins de test ou d'expérimentation".

Donc, bien que l'on puisse imaginer un plugin regroupant du code python pour créer un serveur pywebsocket, étant donné un serveur apache qui le prend en charge, je ne pense pas qu'il serait jamais raisonnable de distribuer un plugin qui l'a fait.


Il existe quelques bibliothèques PHP directes qui prétendent prendre en charge les Websockets. Leur efficacité dans Apache serait un test intéressant. Voir ma mise à jour pour les liens ...
EAMann

3

En réponse à votre mise à jour, à mon avis et sur la base des recherches que j'ai faites, ce serait la meilleure option. Encore mieux serait de créer le plugin frontal et de créer le service websocket externe pour parler avec les plugins, et de facturer des frais pour que vous puissiez monétiser votre idée, si vous le souhaitez. Vous pouvez même fournir le code source du service websocket et créer un paramètre dans le plugin pour définir où (quel domaine / IP et port) se trouve le service websocket.


2

Oubliez l'apache2 "classique" - apache2-mpm-prefork - à cet effet. Apache2-mpm-event pourrait peut-être gérer cela, mais c'est expérimental. Comme apache2 n'est pas piloté par les événements, le problème décrit par @marfarma existe. Vous aurez besoin d'un serveur Web événementiel pour ce type de service, par exemple cherokee ou nginx.

nginx peut être un réel avantage pour WordPress (car wordpress.com l'utilise également comme serveur), et il peut proxy des requêtes spécifiées à un service node.js par exemple.

Quelques exemples dans le sujet:

J'ai également fait un petit tutoriel pour la configuration de nginx + php-fpm + wordpress .


Oublier l'approche "classique" n'est pas vraiment une option pour produire un plugin facile à installer pour les utilisateurs profanes. Oui, utiliser nginx, cherokee ou node.js pour servir des choses à partir du serveur est une option, mais vous ne pouvez pas simplement mettre cela dans un fichier Lisez-moi du plugin et espérer que les utilisateurs a) le comprendront ou b) pourront faire quoi que ce soit il.
EAMann

apache2-mpm-prefork n'a pas été conçu pour pouvoir gérer ce type d'utilisation. Il existe des plugins nécessitant memcached, APC, etc., donc cela ne peut nécessiter qu'un serveur Web basé sur les événements. Il s'agit d'une exigence de backend, mpm-prefork et mpm-worker ne sont pas pour cela.
petermolnar

1

Une autre solution potentielle consiste à utiliser un fournisseur de sockets Web tiers, j'ai un peu joué avec Pusher (http://pusher.com/), il y a une API sur laquelle vous pouvez puiser qui pourrait bien fonctionner pour ce que vous essayez de faire. J'ai réfléchi à la façon dont je pourrais l'utiliser dans mes propres sites WordPress.

Un inconvénient possible est que d'autres personnes essayant d'utiliser votre plugin devraient également obtenir un compte Pusher pour le faire fonctionner. Il est beaucoup plus facile de travailler qu'avec l'installation de votre propre serveur Web Sockets et sa maintenance, ce serait en fait un avantage pour les autres qui essaient d'utiliser votre plugin.


0

La réponse courte est: oui, c'est faisable. Je pourrais examiner quelque chose d'un peu plus distribué qu'un seul point de défaillance VPS que vous hébergez, cependant. Peut-être examiner certains systèmes EC2 à charge équilibrée ou quelque chose comme ça? (Je suppose que vous avez une source de revenus pour fournir de telles commodités. Sourire )


1
"une
source de
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.