Skip to content

Releases: Qbix/webserver

v1.3.0 – Boldly Go

Choose a tag to compare

@github-actions github-actions released this 20 Sep 04:30

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

Choose a tag to compare

@github-actions github-actions released this 17 Sep 18:05

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_SELF
  • PHP_AUTH_USER / PHP_AUTH_PW parsed from Basic auth
  • HTTPS detection from X-Forwarded-Proto
  • Multipart form parsing ($_POST + $_FILES)
  • Status codes from Q_WebServer_State::getStatusCode()
  • php://input stream 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

Choose a tag to compare

@github-actions github-actions released this 07 Sep 17:03

Full Changelog: v1.0.0...v1.1.0

v1.0.0 — Boldly Go

Choose a tag to compare

@EGreg EGreg released this 31 Aug 03:52

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_64

Or 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=N with 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 --app mode
  • 160+ tests across 6 suites