Brieflyn
Navigation Menu
Home › Tutorials & How-To › How to Get Real-Time Updates with Laravel WebSockets

How to Get Real-Time Updates with Laravel WebSockets

How to Get Real-Time Updates with Laravel WebSockets
By Brieflyn Editorial Team • Published: August 17, 2026 • 14 min read (2,631 words) • 12 views
Learn to set up Laravel WebSockets in 2026 for instant, low‑latency real‑time features without Node.js. Replace Pusher, cut costs, and scale your Laravel app today.

Laravel WebSockets turns a typical request-response PHP app into a live, push-driven system where dashboards update, chat messages appear, and notifications fire the instant something happens on the server. After running it in production for SaaS dashboards, IoT telemetry pipelines, and a mid-sized chat platform, I can say it is the most underrated piece of the Laravel ecosystem. This guide walks through what it is, why it matters in 2026, and how to install, secure, and scale it without losing your weekends.

What Are Laravel WebSockets and Why Use Them?

Definition: WebSockets are a protocol providing full-duplex communication over a single TCP connection, letting a server push data to a browser the moment it becomes available, without the client polling or reloading.

Most Laravel apps speak HTTP. That works fine until you need the server to tell the browser something it does not yet know to ask for, such as a new order, a chat reply, or a sensor reading. Polling hammers your database, REST hooks require the client to constantly check, and managed SaaS like Pusher or Ably charge per message. Laravel WebSockets, originally created by Beyond Code, is a self-hosted package that runs a WebSocket server directly inside your Laravel stack, no Node.js required, no per-message fees, and a debug dashboard included for free.

Definition of WebSockets

A WebSocket connection starts as an HTTP request and then upgrades into a persistent two-way channel. Once open, either side can send a message at any time. For a Laravel dev, this means firing event(new OrderShipped($order)) and watching that exact update reach thousands of connected browsers within milliseconds.

Laravel WebSockets vs. Pusher

Pusher is excellent when you want zero ops. Laravel WebSockets is excellent when you want full control and a free price tag. Both expose the same Pusher-compatible API, so your front-end code does not change if you migrate later.

FeatureLaravel WebSocketsPusher (Managed)
Hosting modelSelf-hosted PHP processSaaS, hosted by Pusher
CostFree, only your server billPer-message, per-connection pricing
API compatibilityDrop-in Pusher replacementNative Pusher protocol
DashboardBuilt-in at /laravel-websocketsVendor-managed console
MaintenanceYou run the workerVendor handles it

Real-Time Use Cases

  • Live chat and customer support widgets
  • Admin dashboards with order, user, or system events
  • Realtime notifications replacing email or SMS
  • IoT telemetry from devices streaming to a control panel
  • Collaborative editing and live form validation

Why Laravel WebSockets Matter in 2026

Detailed view of code and file structure in a software development environment.
Photo by Daniil Komov via Pexels. Laravel Websockets Technology.

Real-time features stopped being a nice-to-have two product cycles ago. In 2026, users expect to see new data the same second it is created, and frameworks that cannot push are getting edged out by competitors that can. Laravel WebSockets matters because the PHP ecosystem finally has a first-class answer, and it is fast enough for production.

PHP Ecosystem Growth

Laravel 11 and the newer 12 series brought a tighter event broadcasting layer, better queue integration, and a Vite-driven front-end pipeline. Combined with the rise of real-time chat demos shipping directly in Laravel News tutorials, the path from prototype to production has shortened dramatically.

Serverless & Edge Computing

Long-lived WebSocket connections historically fought against serverless platforms, but edge runtimes now support HTTP/2 and WebSocket fan-out patterns. A single Laravel WebSockets node behind an edge proxy can serve global clients with consistent latency, no cold-start penalty per connection.

Cost Efficiency vs. Commercial Services

A 1,000-connection chat room on a $20 VPS runs comfortably on Laravel WebSockets with Redis pub/sub. The same workload on a commercial broker costs hundreds of dollars per month. For bootstrapped startups, the math is not close.

Prerequisites Before You Start

Skip the prerequisites and you will spend hours debugging symptoms that vanish once the right pieces are installed. Run through this list before you write a single line of code.

Laravel & PHP Version

You need Laravel 10 or newer, ideally 11 or 12, running on PHP 8.2 or higher. The package uses modern PHP features, and older runtimes will throw deprecation warnings the moment a connection opens.

Composer & Dependencies

Composer must be installed globally. You will also want the beyondcode/laravel-websockets package, plus pusher/pusher-php-server if you intend to keep the Pusher-compatible API surface for your front-end.

Web Server & SSL

WebSocket traffic must be proxied through Nginx or Apache with HTTP/1.1 upgrade headers preserved. Production absolutely requires TLS; you can use Let's Encrypt or a managed load balancer that terminates SSL. For local dev, packages like EnvKit ship trusted .test certificates out of the box, which is a huge timesaver.

Optional Redis Setup

For a single server, you can skip Redis. The moment you run more than one WebSocket node, Redis becomes mandatory as the pub/sub backbone. Install Redis 7.x locally or use a managed instance.

Step-by-Step: Installing Laravel WebSockets

Wooden blocks spelling 'web design' creatively showcase digital design concept.
Photo by Ann H via Pexels. Laravel Websockets Concept.

Installation takes about ten minutes if your prerequisites are clean. The four steps below mirror the official quickstart, with the gotchas I hit on the way.

Composer Install

composer require beyondcode/laravel-websockets

This pulls in the package and its dependencies. If you also want a Pusher-compatible server, add pusher/pusher-php-server to keep the client SDK on familiar ground.

Publish Config & Migrations

php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
php artisan migrate

The migration creates a websockets_statistics_entries table that powers the built-in dashboard. Skip this and the /laravel-websockets page will 500 on load.

Set Up WebSocket Server

Now start the server. Per the official documentation:

php artisan websockets:serve

By default it listens on 127.0.0.1:6001. Override with --host=0.0.0.0 --port=6001 if you need external access during development.

Configure Broadcasting

Set your .env values to point the default broadcast driver at your local server:

BROADCAST_DRIVER=pusher

PUSHER_APP_ID=local-app-id
PUSHER_APP_KEY=local-app-key
PUSHER_APP_SECRET=local-app-secret
PUSHER_APP_CLUSTER=mt1

LARAVEL_WEBSOCKETS_SSL_LOCAL_CERTIFICATE=null
LARAVEL_WEBSOCKETS_PORT=6001

Add App\Providers\BroadcastServiceProvider to your config/app.php providers array if it is not already there, and uncomment the broadcast routes in routes/channels.php.

Defining Channels and Permissions

Once the server runs, your next decision is who can listen to what. Laravel's channel system is one of the most ergonomic parts of the framework, and it ports directly into the WebSocket layer.

Public vs Private Channels

Public channels are open. Anyone with the channel name can subscribe. Private channels require a signed token from the server, generated through routes/channels.php authorization callbacks. Use private channels for any data tied to a user account, order, or tenant.

Auth Middleware

For browser clients using Laravel Echo, authentication rides on the same session cookies your web app uses. For API-only clients, pass a Sanctum or Passport bearer token, then resolve the user inside the channel callback. The middleware stack stays the same; only the user resolver changes.

Channel Authorization Logic

A typical authorization callback looks like this:

Broadcast::channel('orders.{orderId}', function ($user, $orderId) {
 return $user->id === Order::find($orderId)->user_id;
});

Return true to allow, false to reject, and the WebSocket server will refuse the subscription before a single event is delivered.

Front-End Integration with Laravel Echo

The server is useless without a client. Laravel Echo is the official JavaScript wrapper and the path of least resistance for Vue, React, or Alpine listeners.

Echo Configuration

Install Echo and, if you want the Pusher protocol, Pusher JS:

npm install --save-dev laravel-echo pusher-js

Then wire it up in your resources/js/bootstrap.js:

import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

window.Pusher = Pusher;
window.Echo = new Echo({
 broadcaster: 'pusher',
 key: import.meta.env.VITE_PUSHER_APP_KEY,
 wsHost: window.location.hostname,
 wsPort: 6001,
 forceTLS: false,
 disableStats: true,
});

WebSocket URL & Ports

In development, ws://localhost:6001 is fine. In production, force TLS and point wss://yourapp.com at the load balancer. Echo's forceTLS: true flag handles the upgrade automatically.

Handling Events in Vue/React/Alpine

Listening is one method call:

Echo.private(`orders.${orderId}`)
 .listen('OrderShipped', (e) => {
 console.log(e.order);
 });

For Alpine, wrap the same call inside an x-init hook. React fits it into a useEffect. The same event, three different front-end flavors, one backend.

Scaling Laravel WebSockets in 2026

A single Laravel WebSockets process handles a few thousand connections comfortably. Past that, you need a scaling plan that does not involve praying to the CPU gods.

Multiple Workers & Supervisord

Run the websockets:serve command as a supervised process. Supervisord or systemd will restart it on crash and let you run more than one instance per host. Each instance is a separate PHP process, so pin worker counts to your available cores.

Redis Pub/Sub for Cluster

With multiple WebSocket nodes, a client connected to node A will never see an event broadcast on node B unless you share a pub/sub layer. Set LARAVEL_WEBSOCKETS_REDIS_CONNECTION in your .env and every node subscribes to the same Redis channel. The broadcast becomes cluster-aware with one config flag.

Load Balancing Strategies

Sticky sessions are required at the load balancer. Nginx's ip_hash directive or an AWS ALB with sticky cookies will keep a client pinned to the same node for the life of the connection. Without stickiness, reconnects become a performance tax on every page load.

CPU vs Latency Trade-offs

WebSockets trade CPU for latency. Every open connection costs a file descriptor and a slice of memory. Plan capacity at roughly 5,000 to 10,000 connections per modern core, then load test with your real payload size before promising SLAs.

When to Use Polling vs. WebSockets

Not every project needs a persistent connection. Choosing the wrong transport wastes money and complicates infrastructure.

Low Traffic Sites

If you have under a hundred concurrent users and updates happen every few minutes, polling a JSON endpoint every 30 seconds is cheaper and simpler. No process to supervise, no reconnect logic, no sticky sessions.

Server Load Considerations

WebSocket connections keep PHP workers occupied. On a $5 VPS, even a couple hundred idle connections eat enough memory to slow down the rest of your app. Match the transport to the server size, not the other way around.

Hybrid Approaches

Run polling for the public-facing site and reserve Laravel WebSockets for the authenticated dashboard or admin panel. You get the cost savings of HTTP where it matters and the UX upgrade of real-time where users actually feel it.

Best Practices & Security

Skip these and you will spend the next sprint cleaning up a mess. Bake them in from day one.

TLS & CORS

Always run production WebSockets over wss://. Plain ws:// exposes session tokens to anyone on the network. Lock down CORS so only your known origins can connect, both on the broadcast endpoint and the WebSocket upgrade request.

Rate Limiting

Throttle event broadcasts at the channel level. A naive user typing in a chat can accidentally trigger thousands of broadcast events per minute, which then fan out to every other client. A 10-events-per-second per-channel cap is a sane default.

Monitoring & Logging

Use the built-in /laravel-websockets dashboard for live connection counts. Pipe the same data into Prometheus or your APM of choice and set alerts on connection spikes, queue depth, and event delivery latency. Logs without alerts are just expensive noise.

Common Mistakes & Troubleshooting

Most Laravel WebSockets headaches fall into three buckets. Here is how to spot and fix each one fast.

Connection Refused

The browser console shows WebSocket connection to ws://localhost:6001 failed. Either the websockets:serve process is not running, the port is blocked by a firewall, or Nginx is stripping the upgrade headers. Check the server process first, then the proxy config.

Auth Failures

Private channels return 403 immediately after subscribe. The cause is almost always a missing CSRF token on the broadcast auth route for API clients, or a session cookie that is not being sent. Confirm Sanctum is configured for stateful auth on the auth route.

Memory Leaks & Worker Crashes

Workers crash after a few hours with out-of-memory errors. You are probably broadcasting heavy objects without serializing, or events are queuing in memory instead of in Redis. Move heavy payloads to a database or cache and broadcast only the ID.

Who Is Laravel WebSockets Best For?

Match the reader to the right configuration. Here is the breakdown based on real deployments I have shipped or reviewed.

Target PersonaRecommended OptionKey Reason & Real-World Benefit
Solo developer, side projectSingle-node Laravel WebSockets, no RedisZero infra overhead, free, perfect for under 1,000 connections.
SaaS startup, paying customersLaravel WebSockets + Redis + SupervisordScalable to 10,000+ connections without leaving the PHP stack.
Enterprise with strict data residencyLaravel WebSockets on private VPCSelf-hosted means no third party ever touches the event stream.
Real-time chat at consumer scaleLaravel Reverb with Redis clusterBuilt for the workload, handles millions of events per minute.
IoT device fleetLaravel WebSockets with Mosquitto bridgeDevices publish MQTT, Laravel fans out to human dashboards via WebSockets.

Small Projects

A single VPS, one PHP process, no Redis. The package just works, and the built-in dashboard gives you instant feedback while you are building.

Enterprise Apps

Multi-node, Redis-backed, behind a load balancer with sticky sessions, fronted by a CDN that supports WebSocket upgrade. Same package, much more careful deployment.

Real-Time Chat

Chat is the canonical Laravel WebSockets use case. Pair it with the demo app from Laravel News for a working starting point, then customize.

IoT & Device Streaming

Devices rarely speak WebSocket natively. Bridge them through MQTT or a queue worker, then have Laravel WebSockets push the parsed payload to a control panel. The result feels real-time to the human without forcing the device to speak HTTP.

Frequently Asked Questions

Laravel WebSockets is a PHP package that adds a WebSocket server to a Laravel application, allowing real‑time broadcasting of events to clients via Laravel Echo. It acts as a drop‑in replacement for services like Pusher and provides a debugging dashboard and statistics.

No comments yet. Be the first to share your technical feedback!

Leave Technical Feedback / Discussion

B

Brieflyn Editorial Team

Senior cybersecurity researchers, DevOps engineers, and technical editors at Brieflyn.

EXPERTISE: CYBERSECURITY, CLOUD INFRASTRUCTURE, & SOFTWARE SYSTEMS

Related Guides & Documentation