Releases: Qbix/webserver
Release list
v1.3.0 – Boldly Go
Full Changelog: v1.2.0...v1.3.0
Qbix Server v1.3.0 – Boldly Go
Cross-Platform Release
This release adds Windows support, a built-in ACME client, a control panel with framework management, and the ability to bundle your app into a single distributable binary.
Windows COW Fork
Qbix Server now runs on Windows with copy-on-write process forking — the same memory model that makes it fast on Linux and macOS. A small DLL (qbix_fork.dll, 15KB) calls the Windows kernel's RtlCloneUserProcess via FFI to fork the server process with COW page sharing. Each worker shares the parent's loaded PHP classes and only allocates memory for pages it writes to during the request.
If the DLL isn't present or the FFI extension isn't available, the server falls back to php-cgi subprocess mode — still functional, just without COW memory savings.
Download
| Platform | Binary | COW Fork |
|---|---|---|
| Linux x86_64 | qbixserver-linux-x86_64 | Yes (pcntl) |
| Linux ARM64 | qbixserver-linux-aarch64 | Yes (pcntl) |
| macOS ARM64 | qbixserver-macos-arm64 | Yes (pcntl) |
| Windows x64 | qbixserver-windows-x64.exe + qbix_fork.dll | Yes (RtlCloneUserProcess) |
What's New
ACME v2 Client — built-in Let's Encrypt integration. Set "tls": "auto" on a domain and the server provisions certificates on startup via HTTP-01 challenges. No certbot needed.
Control Panel — 11 tabs managing every aspect of the server:
- Apps — list, create, serve apps. Per-app fork mode toggle (persistent / fork-per-request / auto).
- Domains — add domains, view cert status, one-click ACME provisioning.
- Workers — live pool stats (count, active, memory, PID).
- Logs — real-time access and error log viewer.
- Cron — scheduled tasks with "Run Now".
- Frameworks — auto-detects Laravel, Symfony, WordPress, Drupal, Joomla. Shows packages from composer.lock, wp-cli, drush, or filesystem scanning. Install, update, remove, activate/deactivate from the panel. Clone plugins from GitHub URLs.
- Plugins (Qbix) — three-layer version tracking: declared (config/app.json), installed (local/plugins.json), schema (Q_plugin table + extra JSON). npm/composer badges per plugin. Run the Qbix installer (
install.php --all) from the panel. - System — PHP version, extensions, disk space, phpinfo() iframe. Key extensions highlighted.
Docs Viewer — browse all 18 markdown docs at /Q/docs. Dark theme, sidebar nav, marked.js bundled locally (no CDN). Links between docs work. Offline fallback parser if marked.js is missing.
--pack Flag — bundle your app into the binary: ./qbixserver --pack=./my-app -o myapp. The binary detects the appended zip at startup and serves from it. Standard zip tools can list and extract the contents. Distribute a single executable file containing the PHP runtime, the server, and your entire application.
System Limits Check — on startup, reads ulimit -n, ulimit -u, pid_max. Tries to raise limits automatically. Warns with platform-specific fix commands if it can't.
Dashboard Enhancements — system RAM usage (Linux/macOS/Windows), per-worker RSS from /proc/ps/tasklist, COW savings comparison, fork mode indicator.
Framework Presets
php qbixserver.php --root=public --preset=laravel
php qbixserver.php --root=public --preset=symfony
php qbixserver.php --root=. --preset=wordpress
php qbixserver.php --root=web --preset=drupal
Two Modes
Persistent workers (default) — workers stay alive across requests. 28 PHP functions shimmed via source transformation. Static properties restored in 0.03ms. Best performance: 2,294 req/s on CPU-bound work.
Fork-per-request — set forkPerRequest: true for code with internal static variables or untrackable global state. Each worker costs ~120KB (COW), so you run 100× more workers than php-fpm on the same hardware.
Bug Fixes
- Pool superglobals (SERVER_SOFTWARE, PHP_SELF, etc.) not set in persistent workers
- Multipart parsing passed lowercased content-type
- Health endpoint 500 after docs route insertion
- Safe worker calculation returned PHP_INT_MAX when fd limit was low
//comment fallback missing in API doc generation
Stats
- 72 unit tests + 55 end-to-end tests, 0 failures
- README split into 18 doc files with relative links
- Panel: 3,882 lines
- WebServer: 5,554 lines
- Total server code: ~13,000 lines of PHP + 165 lines of C
v1.2.0 - Boldly Go
Persistent workers are now the default mode. No flags needed — the server auto-detects worker count from your RAM and CPU. Unmodified WordPress, Laravel, Symfony, and Drupal run 6–24× faster than php-fpm on the same hardware, without code changes.
What's new
Persistent workers as default
Workers auto-detect: min(available_RAM / 200KB, nproc × 200). On a 4GB machine that's 400 workers at 120KB each = 47MB total. No --workers flag needed.
28 shimmed functions (was 19)
Nine new shims: register_shutdown_function, set_error_handler, set_exception_handler, restore_error_handler, restore_exception_handler, spl_autoload_register, spl_autoload_unregister, putenv, plus enhanced ini_set tracking with per-request restore. All tracked per request and cleaned up between requests.
Cached Reflection snapshot restore
ReflectionProperty objects are cached at snapshot time. Restore does only setValue() calls — no per-request Reflection lookups. 31% faster on hello-world, 46% faster on WordPress-like workloads.
Benchmarks (single CPU, PHP 8.3)
| Workload | php-fpm | Swoole | Qbix | vs fpm |
|---|---|---|---|---|
| CPU-bound (WP-like) | ~350 req/s | ~400 req/s | 2,294 req/s | 6.6× |
| I/O 50ms (c=200) | 78 req/s | ~300 req/s* | 1,060 req/s | 14× |
| I/O 200ms (c=400) | 20 req/s | ~200 req/s* | 488 req/s | 24× |
*Swoole coroutines require Runtime::enableCoroutine() and coroutine-aware drivers. Unmodified PHP code uses blocking I/O and hits fpm's ceiling.
API discovery — three formats from one scan
Every app's handlers/ directory is scanned automatically:
/.well-known/openapi.json— OpenAPI 3.1 (Swagger UI, Postman, Redoc)/.well-known/mcp.json— MCP tools for AI assistants (Claude, GPT, Cursor)/.well-known/qbix.json— Federation manifest
Supports PHPDoc, YUIDoc, and bare // comment formats. No annotations required.
Pool worker fixes
$_SERVER:SERVER_SOFTWARE,GATEWAY_INTERFACE,SERVER_PROTOCOL,REQUEST_SCHEME,PHP_SELFPHP_AUTH_USER/PHP_AUTH_PWparsed from Basic auth- HTTPS detection from
X-Forwarded-Proto - Multipart form parsing (
$_POST+$_FILES) - Status codes from
Q_WebServer_State::getStatusCode() php://inputstream wrapper for persistent workers//comment fallback for API doc generation
Config
{
"forkPerRequest": false,
"skipSourceCodeTransform": false
}Both default to false — persistent workers with full shimming. Falsy defaults, descriptive names.
Test results
72/72 passing (was 63/72 in v1.1.0).
Full Changelog: v1.1.0...v1.2.0
v1.1.0 — Boldly Go
Full Changelog: v1.0.0...v1.1.0
v1.0.0 — Boldly Go
A pure PHP web server that replaces nginx + php-fpm. One process serves static files, PHP scripts, WebSocket connections, and a live dashboard.
Install
Download a binary — no PHP installation needed:
| Platform | Download |
|---|---|
| Linux x86_64 | qbixserver-linux-x86_64 |
| Linux ARM64 | qbixserver-linux-aarch64 |
| macOS ARM64 | qbixserver-macos-arm64 |
chmod +x qbixserver-linux-x86_64
./qbixserver-linux-x86_64Or if you already have PHP 8.1+: php qbixserver.php
What's in the binary
PHP 8.3 interpreter (statically linked), SQLite3, OpenSSL, curl, mbstring, pcntl, sockets, posix, phar, session.
Highlights
- Two execution modes: fork-per-request (shared-nothing) and octane (
--workers=Nwith snapshot restore) - Over 100× the concurrent capacity of nginx + php-fpm on the same memory
- WebSocket with Socket.IO v5 protocol and rooms
- SSE / streaming with auto-detection
- Unix domain socket listen (
--socket=/path) for nginx proxy - X-Accel-Redirect access control and X-Cache-Tree component-level caching
- Live dashboard at
/Q/dashboard - Full Qbix Platform compatibility — same APIs, easy migration to
--appmode - 160+ tests across 6 suites