¿Se puede hacer WordPress para soportar websockets?


18

Los Websockets son una tecnología moderna y moderna envuelta en HTML5. Básicamente, puede abrir un websocket para permitir la comunicación persistente de 2 vías con un servidor web. El cliente (interfaz de usuario) puede enviar mensajes espontáneamente, y el servidor también puede enviar mensajes.

La tecnología existente (JavaScript) requiere que todo sea iniciado por el cliente - el servidor no puede enviar nada al cliente que el cliente no tiene solicitudes. Por lo tanto, los scripts deben actualizarse constantemente y volver a solicitar datos que podrían no haber cambiado. Websockets trabajan más en un " empuje base" y dejar que los nuevos datos vienen por el tubo cada vez.

Desafortunadamente, la mayoría de las implementaciones websocket (todo lo que puedo encontrar, de todos modos) requieren una aplicación de servidor específica para funcionar. Las personas ejecutarán Apache en los puertos 80 y 443 (http y https) y ejecutarán otro sistema (generalmente Node.js) en otro puerto (es decir, 8000 u 8080) para manejar las solicitudes de WebSocket.

Esto funciona, obviamente, pero tiene algunos inconvenientes.

Tengo un complemento que quiero construir que se beneficiaría enormemente del uso de websockets dentro de WordPress. Pero si un usuario necesita instalar un segundo servidor web (generalmente imposible para las personas con hosting compartido), entonces no funcionará como un complemento.

Entonces, para cualquiera de ustedes que tenga experiencia, ¿cómo haría que WordPress sea compatible con websockets? Habría que hacer WordPress manejar la comunicación en sí misma, o haz otra escritura mini-servidor en el plugin? Si ya ha hecho esto, ¿cómo lo logró sin romper WordPress?

Posibles recursos?


21/09/11 actualización

Con todo lo que se habla de cómo Apache (el servidor más comúnmente instalado para ejecutar WP en un host compartido) realmente no puede manejar los websockets de forma nativa, me pregunto acerca de una alternativa. Varios complementos (JetPack, por ejemplo) se comunican con un servicio externo o API para generar contenido.

Stats solicita contenido de Automattic. Akismet envía datos de un servidor externo a otro. Después de la fecha límite, envía contenido en el momento de la publicación. Algunas herramientas de SEO pasan cosas de un lado a otro a través de sistemas externos.

Entonces, como alternativa a alojar el código websocket dentro de un complemento de WordPress, ¿sería factible alojar un servicio websocket en una ubicación central y tener una interfaz de WordPress interactuando con eso?


3
La conclusión es esta: si los websockets no funcionan bien con el servidor web nativo, entonces no puede hacerlo fácilmente con ese servidor web. Este no es un problema específico de WordPress. Como dijiste, los websockets generalmente requieren un servidor separado como node.js o algo así, no van a funcionar muy bien con Apache. Por lo tanto, su problema no es "cómo lo hago compatible con WordPress", sino "cómo lo hago funcionar en el alojamiento de denominador común más bajo", que es un hervidor de pescado completamente diferente.
Otto

El soporte de WebSocket podría agregarse al núcleo de WordPress, con un servidor WebSocket incorporado y un punto final como admin-ajax.php, ¿no? También está la biblioteca de JavaScript de frontend / Node.js Socket.IO para WebSocket con sondeo como alternativa, desarrollada por Automattic, la compañía detrás de WordPress.
baptx

Respuestas:


8

WebSockets utiliza el protocolo websockets: WS: /example.com/yourscript.js y abre una conexión síncrona, lo que significa que la conexión se mantiene abierta y dedicada al navegador.

Los servidores httpd, como apache2 (utilizado por la mayoría de los proveedores de alojamiento compartido) utilizan el protocolo http: http://example.com/yourscript.jsy abren una conexión asincrónica, lo que significa que no se mantiene abierta ninguna conexión entre el servidor y el navegador. (Puede prolongar las conexiones abiertas, modestamente, estableciendo ciertos parámetros de configuración, pero en general es asíncrono).

Como puede imaginar, mantener conexiones abiertas entre el navegador y el servidor dedica más recursos del servidor a cada conexión del navegador y, por lo tanto, es más exigente para los recursos del servidor que desconectar las conexiones después de cada solicitud. Es comprensible que los proveedores de alojamiento compartido no estén dispuestos a admitir WS en alojamiento compartido.

Si bien ciertos hosts compartidos pueden tener instalado mod_python, lo que permite a los usuarios de su complemento ejecutar pywebsocket , la propia documentación de pywebsocket establece claramente que "pywebsocket está destinado a pruebas o fines experimentales".

Entonces, si bien uno puede imaginar un plugin que agrupa el código de Python para crear un servidor pywebsocket, dado un servidor apache que lo admite, no creo que sea razonable distribuir un complemento que lo hiciera.


Hay algunas bibliotecas PHP rectas que dicen admitir websockets. Si funcionarían o no efectivamente dentro de Apache sería una prueba interesante. Vea mi actualización para enlaces ...
EAMann

3

En respuesta a su actualización, en mi opinión y en base a la investigación que he realizado, esa sería la mejor opción. Aún mejor sería crear el complemento front-end y crear el servicio websocket externo para hablar con los complementos, y cobrar una tarifa por él para que pueda monetizar su idea, si lo desea. Incluso podría proporcionar el código fuente para el servicio websocket y crear una configuración en el complemento para establecer dónde (qué dominio / IP y puerto) se encuentra el servicio websocket.


2

Olvídese del "clásico" apache2 - apache2-mpm-prefork - para este propósito. Tal vez apache2-mpm-event podría manejar esto, pero es experimental. Como apache2 no está controlado por eventos, el problema descrito por @marfarma existe. Necesitará un servidor web controlado por eventos para este tipo de servicio, por ejemplo cherokee o nginx.

nginx puede ser un beneficio real para WordPress (ya que wordpress.com lo usa como su servidor también), y puede enviar solicitudes específicas a un servicio node.js, por ejemplo.

Algunos ejemplos en el tema:

También hice un pequeño tutorial para la configuración de nginx + php-fpm + wordpress .


Olvidar el enfoque "clásico" no es realmente una opción para producir un complemento fácil de instalar para usuarios legos. Sí, usar nginx, cherokee o node.js para servir cosas desde el servidor es una opción, pero no puede simplemente poner eso en un archivo Léame del complemento y esperar que los usuarios a) lo entiendan ob) puedan hacer algo al respecto eso.
EAMann

apache2-mpm-prefork no fue diseñado para poder manejar este tipo de uso. Hay complementos que requieren memcached, APC, etc., por lo que esto solo podría requerir un servidor web basado en eventos. Este es un requisito de back-end, mpm-prefork y mpm-worker no es para esto.
petermolnar

1

Otra posible solución es usar un proveedor externo de sockets web, he jugado un poco con Pusher (http://pusher.com/) un poco, hay una API que puede aprovechar que podría funcionar bien para lo que usted estás tratando de hacer. He estado contemplando cómo podría usarlo en mis propios sitios de WordPress.

Una posible desventaja es que otras personas que intenten usar su complemento también tendrían que obtener una cuenta Pusher para que funcione. Es mucho más fácil trabajar con él que instalar su propio servidor Web Sockets y tener que mantenerlo, eso sería una ventaja cuando se trata de que otros intenten usar su complemento.


0

La respuesta corta es: sí, es factible. Sin embargo, podría buscar algo un poco más distribuido que un solo punto de falla VPS que aloja. ¿Tal vez mirar en algunos sistemas EC2 con equilibrio de carga o algo así? (Supongo que tiene un flujo de ingresos para proporcionar tales comodidades. Sonrisa )


1
"un flujo de ingresos para proporcionar tales comodidades" ... eso sería bueno :-)
EAMann
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.