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