Features / Async first

Async is where PHP apps actually break.

A webhook fires four jobs, broadcasts over a websocket, one of them throws. Unravel keeps the whole async chain in one causal trace, from the request that started it to the frame that failed.

The dark corners

One trace, across every boundary.

Click through four real production surfaces. Each one is a place a request leaves the foreground, where most tools lose the thread.

01

Inside one trace

One webhook dispatched four jobs and a broadcast. They stay in the same trace: dispatch, run phases, their own queries and outbound calls.

app.unravel.run/…/traces/019eb2c7…
Async jobs section of a production trace: queued runs with dispatched and processed phases, nested SQL and outbound HTTP

POST /webhooks/paid: the foreground response ends, four queued runs and a broadcast carry on below it, each with phases, queries and outbound calls.

02

Reverb, watched live

Every websocket connection, channel and subscription. Who is connected right now, what they were sent, what went stale.

app.unravel.run/…/connections/709043370…
A single Reverb websocket session: subscriptions with auth handshake, message frames and staleness

A live Reverb socket: subscriptions with their auth handshake, frames in and out, staleness per connection.

03

Jobs keep their trace

A queued job carries the trace of the request that dispatched it, so the checkout that queued the email reads as one story.

app.unravel.run/…/events/011fcd43…
Job run detail: queued, processing and processed phases, the parent request's trace context, and the job's own events

One job run: queued, processing, processed. The request that dispatched it is one click away, in the same trace.

04

Scheduled and console too

Cron tasks and artisan commands are traced like requests: their queries, their failures, their timing drift.

app.unravel.run/…/traces/019eb2cc…
Scheduled task trace: an artisan command with slow-span insight, SQL and outbound HTTP in the timeline

artisan expo:tickets:check under the scheduler: its queries, its slow outbound call, its share of the trace.

Why it matters

A queued job keeps the trace that dispatched it.

The checkout and the email it queued are one story, because the job keeps the dispatching request's trace. A broadcast carries the id of the trace that emitted it, so a realtime message links straight back to the request behind it, and back again.

Cron tasks and artisan commands are traced like requests, with their own queries, failures and timing drift. Reverb connections, channels and subscriptions are watched live: who's connected, what they were sent, what went stale. See framework support →

Stop reconstructing incidents from logs.

Connect your real app in two minutes. Free forever on a 3-day window, the full debugger included.

Start free