Askr documentation
Askr is a standalone, memory-safe PHP application server written in Rust. It embeds the PHP interpreter in-process (no FastCGI, no FPM), serves it from a memory-safe hot path, and — in worker mode — boots your app once and serves many requests against it, eliminating per-request framework bootstrap.
Version 0.2.1. Production target is Linux; development also works on macOS.
Start here
| Guide | What it covers |
|---|---|
| Architecture | How Askr works: embedding, non-ZTS process-per-core, the worker loop, request lifecycle, TLS, recycling, reload, the admin plane. |
| Building | Building libphp (macOS & Ubuntu) and the askr binary; the extension matrix. |
| Configuration | The askr.toml reference, CLI flags, and environment variables. |
| CLI reference | Every command and flag (serve, doctor, config-check). |
| Worker mode | Boot-once-serve-many, the Laravel worker script, per-request state reset, writing your own worker. |
| CoW template | Boot once, fork workers (copy-on-write) — ~ms warm respawn + shared memory (experimental). |
| Shared cache | In-binary cache, atomic counters and rate limiting (no Redis); the Laravel driver. |
| Broadcasting | Live updates to browsers via SSE + askr_broadcast() (no Reverb/Pusher). |
| Admin dashboard | The built-in status/reload/metrics API and web dashboard. |
| Deployment | Production: systemd, TLS, zero-downtime reload, recycling, scaling, hardening. |
| Ubuntu setup | Recommended production install on Ubuntu (release tarball, systemd, TLS, tuning). |
60-second tour
Install a self-contained release (Linux x86_64 / arm64) and serve a Laravel app:
VER=v0.2.1; ARCH=$(uname -m)
curl -fsSLO https://github.com/kwhorne/askr/releases/download/$VER/askr-${VER#v}-linux-$ARCH.tar.gz
tar xzf askr-${VER#v}-linux-$ARCH.tar.gz && cd askr-${VER#v}-linux-$ARCH
./askr-run.sh doctor
ASKR_APP_BASE=/var/www/app ./askr-run.sh serve \
--root /var/www/app/public \
--worker-script examples/laravel-worker.php \
--workers "$(nproc)" --tls-self-signed --admin 127.0.0.1:9000
Production setup (systemd, TLS, hardening): Ubuntu setup. Building from source: Building.
What works today (0.2.1)
- Embedded PHP (non-ZTS) running real Laravel 12, ~9× the per-request/FPM model
- Multi-core via one worker process per core on a shared listen socket
- Worker mode (Octane-style) with per-request state reset — no bleed
--paranoidstate-bleed detector — is your app worker-safe?- CoW template (
--cow) — boot once, fork workers for ~ms warm respawn (experimental) - Queue workers + scheduler in the same binary (no Horizon/cron)
- Shared cache (
askr_cache_*+ Laravel driver) — cache/counters/rate limiting, no Redis - Broadcasting — live updates via SSE +
askr_broadcast(), no Reverb/Pusher - Graceful recycling + auto-respawn + crash resilience
- TLS (rustls) + HTTP/2;
--tls-self-signedfor dev - Zero-downtime rolling reload on
SIGHUP, with optional canary - Request hardening: body-size limit (413), HEAD, GET/POST
- Typed
askr.tomlconfig +config-check - Built-in admin dashboard + API (status, reload, live metrics)
- In-process metrics — PHP-vs-I/O split, latency histogram, per-worker RSS
askr doctorpre-flight checks
Not yet
The per-core io_uring I/O core (the biggest efficiency step, Linux), HTTP/3
(QUIC), raw WebSockets / Reverb-protocol compatibility, multipart $_FILES,
OpenTelemetry export, seccomp/Landlock sandboxing, and the askr-laravel
composer package.