Hace un tiempo hablamos de Laravel WebSockets en el grupo de facebook Hablemos de Laravel y quedaron muchas cosas en el tintero. Así que, en este artículo vamos a ver mas sobre este excelente paquete.
¿Qué es Laravel WebSockets?
Laravel WebSockets es un paquete que nos permite trabajar con sockets utilizando PHP. Nos permite reemplazar servicios de terceros como Pusher o Laravel Echo Server y prescindir de un servidor Nodejs. Además, es muy fácil de utilizar y tiene una documentación realmente completa.
¿Para que sirve?
Laravel WebSocket nos permite establecer una conexión entre el navegador y el servidor donde podemos enviar un mensaje desde el servidor al cliente o viceversa (a diferencia de Ajax que solo nos permite enviar mensajes desde el cliente al servidor), todo esto sin la necesidad de utilizar javascript.
Los web sockets se utilizan normalmente en sitios web o aplicaciones donde el tiempo de respuesta tenga que ser al instante. Por eso es utilizando en chats, actividades de usuarios y notificaciones.
¿Por qué elegir Laravel WebSockets teniendo Pusher o Laravel Echo Server?
Muchas personas están acostumbradas a utilizar Pusher ya que viene integrado en Laravel. Pero tiene sus limitaciones como por ejemplo, el precio.
También tenemos la posibilidad de utilizar Laravel Echo Server pero su implementación es engorrosa y terminamos buscando la configuración correcta en StackOverflow después de algunas horas.
Además, ambas soluciones requieren que tengamos instalado Node.js en nuestro servidor.
En cambio, Laravel-WebSocket es gratis, su configuración es realmente simple y esta construido sobre Ratchet, un paquete de bajo nivel que trabaja con web sockets.
Laravel WebSockets tiene soporte para multi-tenancy, por lo que podemos configurar un único servidor websocket para utilizarlo en muchas aplicaciones diferentes.
No solo eso! Para proteger los mensajes transmitidos por el servidor websocket, el paquete tiene soporte SSL. De esta forma, todo el trafico pasara por HTTPS (si no sabes como configurar HTTPS en toda tu web, mira el articulo de SSL en Apache o SSL en Nginx)
Y no solo eso! Este maravilloso paquete viene con un panel de control en tiempo real que nos permite controlar todas nuestras conexiones y transmisiones que ocurren en nuestra aplicación. 👏
Cómo utilizar Laravel WebSockets
Como dijimos, es muy fácil utilizar este paquete ya que se instala y se configura como cualquier otro paquete de Laravel que hayas instalado con Componser.
Instalación
composer require beyondcode/laravel-websockets
A continuación, debes publicar el archivo de configuración.
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"
Si lo deseas, puedes publicar las migraciones del paquete que permite el almacenamiento de información y estadísticas de nuestro servidor websocket.
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
Y ejecutas las migraciones.
php artisan migrate
Y por ultimo debemos completar las variables de entorno APP_NAME
, PUSHER_APP_ID
, PUSHER_APP_KEY
, PUSHER_APP_SECRET
en nuestro archivo .env
.
Pero, ¿por qué completar estas variables si dijimos que Laravel-WebSocket no utiliza Pusher? Esto es porque el paquete utiliza el código de Pusher (como los canales de transmisión) pero no el se servicio. Todos los mensajes son manejados por Ratchet y no por Pusher. Además, si tu proyecto utilizaba Pusher la migración será sin dolores de cabeza. 😉
Si no queres utilizar nada de nada de Pusher o Echo, entonces puedes definir tus propios canales y tendrás el control total de la mensajeria. Para eso, puedes mirar la documentación oficial de Laravel WebSockets.
Una vez que hayas terminado la instalado, puedes iniciar el servidor web socket con un simple comando:
php artisan websockets:serve
Integrar Laravel-WebSocket con Laravel Echo
Al final de tu archivo resources/js/bootstrap.js
debes ingresar la siguiente configuración para establecer la comunicación entre el servidor websocket con el cliente.
import Echo from "laravel-echo" window.Pusher = require('pusher-js'); window.Echo = new Echo({ broadcaster: 'pusher', key: 'tu-key-pusher', wsHost: window.location.hostname, wsPort: 6001, disableStats: true, });
Como puedes ver estamos estableciendo disableStats
en true
para desactivar el envío de estadísticas a Pusher.
Eso es todo! Ahora ya puedes usar todas las funciones de Laravel Echo en combinación con Laravel WebSockets, como Presence Channels , Notifications y Broadcasting de Laravel.
Versión disponible de Laravel
El paquete Laravel-WebSocket fue lanzado a fines del 2018 por lo tanto lo hicieron disponible para la versión de Laravel 5.7 en adelante.
Bonus: Correr servidor web socket automáticamente
Para correr el servidor automáticamente tenemos que tener instalado Supervisor.
# Para Debian o Ubuntu apt install supervisor # Para Red Hat o CentOS yum install supervisor systemctl enable supervisor
Una vez instalado debemos crear un archivo dentro de /etc/supervisor/conf.d (en Debian o Ubuntu) o en /etc/supervisord.d (para Red Hat o CentOS). Y añade el siguiente contenido.
[program:websockets] command=/usr/bin/php /home/laravel-echo/laravel-websockets/artisan websockets:serve numprocs=1 autostart=true autorestart=true user=laravel-echo
Ya puedes reiniciar supervisor para que tome la nueva configuración y comience la ejecución.
supervisorctl update supervisorctl start websockets
Si deseas verificar que esta funcionando, lo puedes hacer con el comando upervisorctl status
.
Bonus 2: Acceder al Panel de Control
Para acceder al panel de control del Web Socket debemos ir a la ruta tudominio.com/laravel-websocket
de nuestra aplicación. Si deseas modificar esta ruta lo puedes hacer desde el archivo de configuración config/websockets.php
.
Conclusión
Laravel-WebSocket es un excelente paquete que nos permite manejar una sola tecnología en nuestro servidor descartando Node.js. Además, el panel de control es excelente y su instalación y configuración son muy fáciles. Si te gusto este artículo, házmelo saber en los comentarios de aquí abajo. Nos vemos en la próxima. 😉🤙
Excelente, habría que probarlo para saber cuál sería consumo de recursos en el servidor, excelente aporte
En un video de un youtuber llamado devmarketer señaló que el mismo creador hizo una prueba con un vps de 5$ mensuales de digital ocean y se podía tener hasta 15k sesiones activas ! El precio es mucho más bajo que el pusher
aaah rayos, con esa prueba está más que comprobado que es excelente, lo voy a implementar en el trabajo jejeje
Excelente! Lo pondré en práctica… saludos!
Es una muy buena oportunidad para aprender websockets 😀
A partir de qué versión de Lara el está disponible este paquete?
Hola Carlos. Esta disponible a partir de Laravel 5.7. Ahí actualice la guía con esa información. Gracias.
Gracias por el tutorial. Muy bueno
Gracias!! Hijos de puta!! Son la puta ostia!!
You are puta ostia men
jajaj gracias loco!
A alguien le paso el error:
The requested URL /apps/123456/events was not found on this server.
al momento de emitir desde un evento?
Como le hago para ponerlo a funcionar en un servidor local que no tiene acceso a internet, es una app para usarla en una red local unicamente
para que este funcionan en un servidor de DigitalOcean no me funciona, podrían ayudarme porfavor?
Si, coméntanos que error te esta dando.
Me pasa lo mismo
Muy interesante el paquete. Creo que deberías hacer un tutorial de como usarlo.
Saludos
Algún tutorial de como usar el paquete en un aplicativo real?
No se necesita crear una cuenta de Pusher =D
Es bueno, pero en mi opinión deberían cortar completamente con pusher.
Ya lo implemente y al parecer si funciona, que se se conectan a mi ws pero no logro hacer que el evento se propague a los clientes conectados al socket (apps moviles) y ya tengo la clase evento y el broadcast en el archivo channels de routes, alguna idea de porque sucede esto
Tal vez te este faltando levantar la cola. Prueba con php artisan queue:work
Si tienes las colas configuradas con redis, checkea que el servidor de redis también este levantado.
Puedes ayudarme a configurar mi vps? no logro hacer que funcione, en local funciona perfectamente pero en el vps me dice que no se puedo conectar al wss
Muchas gracias muy bueno, logre hacerlo funcionar pero por mas que he tratado no he logrado al menos se propague. Me explico si coloco a correr el panel observo como se muestra cada uno de los eventos en el terminal, pero si este se apaga no veo nada. Estoy tratando de escuchar las notificaciones desde Angular… estoy en el intento de un chat…. gracias
Hola Xalo, estoy en lo mismo, necesito conectar Angular con Laravel por websockets. Lo has echo? Te has basado en alguna doc o tuto? Gracias!!
Hola Xalo, lograste resolver esto?
Buenas, alguno pudo resolver con angular? yo estoy tratando de conectarlo pero angular no toma los event. Todo lo tengo dokerizado pero no logro ver el problema, es mas en el panel de control de websockets si me muestra los eventos..
Saludos
Quisiera saber como puedo correrlo en un servidor windows 2012 r2, (el websockets:serve)
Como estas Cristian? Despulpa pero nunca me ha tocado trabajar con servidores windows.
Se puede correr en servidores windows saludos.
Ayudaaaa pls no me funciona cuando lo cargo al servidor
Excelente, andaba buscando una alternativa a pusher y al precio de utiluzar su servicio. Ahora a implementarlo y recomendar el artículo.
Sera posible implementarlo en un servidor compartido?
Mmm no te supiera decir. La verdad que no recomiendo servidores compartidos para Laravel y su mundo.
Que servidores recomiendas? soy noob
no entendi la parte de usar pusher, pero haber si estoy bien, en las ENV VARS para PUSHER_APP_ID , PUSHER_APP_KEY & PUSHER_APP_SECRET puedo usar cualquier valor (nunca he usado Pusher, lo hago como mencionas de usar Socket.io + Laravel) solo para que Websocket levante ? o puedo dejar vacio esos valores salvo PUSHER_APP_KEY para llenar el valor de lado de Echo, cierto ? saludos
Así es bro! 👍 Aunque puedes probar sin poner ningun dato, algunos en este artículo han comentado que les funciona igualmente 🤷♂️
Esto se ve interesante, según dicen simplifica mucho el proceso en Laravel Forge, aunque realmente soy un noob para manejo de servidores.
Por ahora quiero probarlo en local, es mucho lo que tengo cambiar si vengo de estar usando Redis + Laravel Echo Server + Socket.io?
Genial, lo tengo probar, gracias por compartir tus conocimientos. 😀
Es hasta ahora el mejor artículo de Laravel WebSockets que he leído, y fíjate que he leído y visto un montón jajaja. Ya lo he leído como 5-6 veces si acaso no más para poder terminar de asimilar cada concepto y cosa de forma sólida. Muchas gracias.
El artículo tiene un pequeño error al día de hoy.
Acá: «Para acceder al panel de control del Web Socket debemos ir a la ruta tudominio.com/laravel-websocket», la ruta correcta es tudominio.com/laravel-websockets (con una ‘s’ al final xd)
De resto genial, y yo me había puesto triste porque no me funcionaba jajajaja
Eres un capo. Te amo.
Muchas gracias por el detalle Moises, lo voy a estar corrigiendo.
Buen dia, es posible utilizarlo, usando las librerias javascript que ya posee pusher? ya tengo una app hecha y no quiero cambiar a Echo, que cambios le debo hacer a la libreria de pusher para que se comunique con mi servidor?
Gracias
Como va bro? La verdad que no se que tenes implementado y como. Deberías hacer tus pruebas.
ayuda soy novato en esto pero tengo una tarea sobre conectar un websocket entre laravel y angular alguien me podría proporcionar sobre algún buen articulo sobre el tema
Esta bien avanza la tecnologia pero sien honesto nodejs lleva mucho mas tiempo laravel en la cuestion webscoket , asi que si voy a usar websocket seguire con node.js 😀
Te felicitamos, genio!!
Los pasos serán similares para implementarlo en Laravel Lumen? Siempre hay alguna vuelta de rosca que hacer, o alguna configuración para habilitar algún comando faltante. Voy a probar.
Excelente articulo, me gustaría ver un ejemplo paso a paso o tutorial con lo explicado.
Buen aporte, no se si tuvieran un tutorial de como hacer el deploy con laravel-websockets, gracias te antemano
tengo un problema al deployarlo en docker en un servidor de amazon me sale el siguiente error Failed to listen on «tcp://0.0.0.0:6001»: Address already in use
Lograste implementarlo en el vps estoy intentando pero no lo consigo
Hola, alguien ah logrado hacerlo correr usando homestead? seguí las instrucciones y me devuelve el error Channels current state is unavailable, estoy usando laravel 8
tengo toda la conf en local funciona perfectamente, pero en el vps me dice que no se puede establecer la conexion wss puedes ayudarme a solucionar?
Desactiva forceTLS: False
Como puedo enviar un evento desde el proyecto de front-end pero desde PHP y no desde la vista? Digamos que el servidor es para varias app entonces ante un suceso determinado en otro proyecto que se suscribe al servidor debería lanzar un evento pero desde el php de ese proyecto cliente. Con rutas no me gusta mucho la verdad y no encuentro otra forma.
Para la probarlo en produccion no se debe configura algo mas