Skip to content

v1.2.0 - Boldly Go

Choose a tag to compare

@github-actions github-actions released this 17 Sep 18:05
· 3 commits to main since this release

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