Pangram verdict · v3.3
We believe this text is mainly AI, with some human-written content.
AI likelihood · overall
AIArticle text · 728 words · 2 segments analyzed
Server Faster than Swoole, FrankenPHP, and RoadRunner on unmodified code. No extensions, no adapters, no Docker. One file. git clone https://github.com/Qbix/webserver cd webserver php qbixserver.php Or grab a self-contained binary curl -LO https://github.com/Qbix/webserver/releases/latest/download/qbixserver-linux-x86_64 chmod +x qbixserver-linux-x86_64 ./qbixserver-linux-x86_64 Everything in one process Replaces nginx + fpm + Node + Redis + supervisor + Docker.
⚡14× ThroughputPersistent workers at 120KB each. 400 workers on 200MB. 1,060 req/s where fpm does 78.Learn more → 🔌WebSocket + RoomsSame port as HTTP. Rooms are forked processes with shared state. Socket.IO protocol. No Node.Learn more → 🧩Unmodified PHPWordPress, Laravel, Symfony, Drupal. 28 functions shimmed. Reads .htaccess. Just works.Learn more → 🔒Microservice IsolationAuthority + sandbox with one config change. Same code, different roles. Secrets never leave the authority.Learn more → 🌐Cluster ReplicationMultiple servers with SQLite. Events replicate. Kill a node, restart — it catches up.Learn more → 📦Six Example AppsChat, kanban, SSE stream, REST API, live counter, distributed swarm. All included.Learn more → 📋Smart Response HeadersX-Cache-Tree for per-component invalidation. X-Accel-Redirect for access-controlled files. ETag generation. Directory listing.Learn more → 📈Auto-Generated API DocsWrite handler files, get OpenAPI 3.1 and MCP specs automatically. Swagger UI, Postman, Redoc — and AI tools can call your app’s API directly.Learn more → 🔐TLS, Cron & LoggingHTTPS auto-starts when certs exist. Built-in cron scheduler. Buffered access logs with daily rotation and gzip archiving.Learn more → 14×vs fpm (50ms I/O) 24×vs fpm (200ms I/O) 120KBper worker (COW) 0.03msstate reset 💡 Why it’s faster than everything else The vast majority of PHP code — WordPress plugins, Laravel packages, every PDO::query() and file_get_contents() ever written — uses blocking I/O. Swoole’s coroutines can’t help with code that doesn’t yield. FrankenPHP and RoadRunner use the same worker-count-limited model as fpm. Qbix takes a different approach: run many workers. The server loads your entire framework into a parent process, then calls pcntl_fork() to create workers. The kernel marks the parent’s pages copy-on-write. Workers share every loaded class — they only pay for pages they actually write to during the request. A WordPress-like request dirties 30 pages = 120KB on Linux. So 200MB doesn’t buy 4 workers (like fpm) — it buys thousands. Each one blocks on its database query, and that’s fine. Blocking I/O doesn’t matter when you have enough workers. COW is what makes “enough workers” cost 47MB instead of 16GB. This is pure userland PHP. No kernel module, no C extension, no custom allocator. Just pcntl_fork() after loading everything, and the OS does the rest. We proposed this for PHP core as switch_global_context(). While that works its way through the RFC process, the server does it in userland today. 🔍 Benchmarks vs Swoole, FrankenPHP, and php-fpm CPU-bound (WordPress-like workload, same 200MB): Workersreq/svs fpm php-fpm4~350— Swoole4~4001.1× Qbix1002,2946.6× I/O-bound (50ms database query): Workersreq/svs fpm php-fpm478— Swoole (coroutines*)4~300~4× Qbix1001,06014× I/O-bound (200ms — real database load): Workersreq/svs fpm php-fpm420— Swoole (coroutines*)4~200–500~10–25× Qbix20048824× * Swoole coroutines require Runtime::enableCoroutine() and coroutine-aware drivers. Unmodified WordPress/Laravel uses blocking I/O and hits fpm’s ceiling. 🛡 28 functions shimmed — how state gets reset Workers are persistent — they handle thousands of requests without restarting. Between each request, a Reflection-based snapshot restores all static properties in 0.03ms. 28 PHP functions are intercepted via source transformation at include time: header(), session_start(), register_shutdown_function(), ini_set(), set_error_handler(), set_exception_handler(), spl_autoload_register(), putenv(), and 20 others — all tracked per request and cleaned up between requests. Unmodified WordPress, Laravel, Symfony, and Drupal get shared-nothing safety automatically. No adapters, no code auditing. Full compatibility details → 📊 How many users can one $30/month machine handle? Metricphp-fpmQbix Workers on 4GB~80 (50MB each)400 (120KB each) Throughput (200ms I/O)~80 req/s~2,000 req/s Concurrent active users1,60040,000 Registered accounts16K–32K400K–800K WebSocketNeeds Node.js100K+ built in DatabaseNeeds PostgresSQLite (50K writes/sec) Monthly cost$30 + DB server$30 total One machine. No database server, no Redis, no Node, no Docker. Add a second with DNS failover for redundancy — distributed mode keeps both SQLite copies in sync. Fork after preload Load everything once. Fork workers. Each costs 120KB, not 42MB. Parent Process (30MB)framework · routes · cachesCOWCOWWorker (120KB)Worker (120KB)Worker (120KB)Worker (120KB)php-fpm: 4 × 42MB = 168MBQbix: 400 × 120KB = 47MBSame code. Same RAM. 100× more workers. Live Dashboard Built-in at /Q/dashboard. No Grafana, no Prometheus. localhost:4000/Q/dashboardQbix Server Dashboard2,847Req/min142Connections400Workers23msLatency99.8%Uptime47MBMemory200 GET /api/users 12ms200 POST /api/tasks 34ms304 GET /css/app.css 1ms200 WS /Q/ws upgrade 2ms Dashboard & control panel docs → Get started git clone https://github.com/Qbix/webserver cd webserver php qbixserver.php --root=examples/todo/web View on GitHub → Download binary Examples