Qbix Server 纯 PHP 服务器:直接干趴Nginx加PHP-FPM


Qbix/webserver 是一个纯 PHP 编写的 Web 服务器,旨在替代 Nginx、Apache 或 PHP-FPM 等传统方案。它主打极致的并发性能、极低的内存占用以及开箱即用的丰富功能。

主要功能一览

Qbix Server 不仅是服务器,更是一个功能完整的应用平台:

  • 全能服务器:单个进程即可处理静态文件、PHP 脚本、WebSocket 连接和实时仪表盘。
  • 高性能与现代化:支持 HTTP/2、gzip/Brotli 压缩、TLS/HTTPS(支持自动证书)及 Unix Domain Socket。
  • 原生 WebSocket 与 Rooms:内置与 Socket.IO v5 兼容的 WebSocket 支持,并独创“Rooms”模式——每个房间一个独立进程,共享状态,非常适合聊天室或游戏。
  • 强大的静态资源处理:支持 ETag、304 缓存、目录列表、图片实时裁剪与格式转换(如 WebP)。
  • 集成管理与监控:提供用于实时监控的仪表盘(/Q/dashboard)、用于管理的控制面板(/Q/panel),以及用于负载均衡的健康检查(/Q/health)。
  • 便捷的开发与部署:支持通过 --deploy 参数一键部署、提供 OpenAPI 规范、内置任务调度器(替代 Cron),并兼容 Qbix Platform。

横向对比:vs FrankenPHP & Swoole

与另外两个流行的现代 PHP 执行方案相比,Qbix Server 的特点鲜明:

  • vs FrankenPHP: Qbix 是纯 PHP,无需 Go 环境;部署更简单(一个 PHP 文件 vs 下载 Go 二进制文件)。
  • vs Swoole: Qbix 无需编译 C 扩展,兼容性 100%,且内存安全。
  • 最大优势 - 状态隔离:FrankenPHP 和 Swoole 的工作进程是持久化的,全局变量和静态属性可能会在请求间“泄漏”,引发隐蔽的 Bug。而 Qbix 的 Fork 模式(进程隔离)和 Octane 模式(快照恢复)都能确保请求间的状态隔离,更安全。

一个纯 PHP 写的服务器,凭什么干掉 Nginx 加 PHP-FPM! 

你敢信,一个用 PHP 写出来的 Web 服务器,在同等硬件上能承载的并发 PHP 请求数量,是 Nginx 加 PHP-FPM 组合的 100 倍!


PHP 写了八十年代码,没几个人想过用 PHP 自己当 Web 服务器。大家都老老实实装 Nginx 或 Apache,再配个 PHP-FPM 进程池,这套组合拳打了快二十年,稳得很。直到 Qbix Server 出现,它说:别装了,我一个 PHP 文件全搞定。

一个 PHP 文件就是一台完整的 Web 服务器

Qbix Server 是一个纯 PHP 编写的 Web 服务器。它不需要 Nginx,不需要 Apache,不需要 PHP-FPM。单个进程就能同时服务静态文件、PHP 脚本、WebSocket 连接,还自带一个实时仪表盘。启动就一行命令:php qbixserver.php --port=8080。甚至还有一个 196KB 的 PHAR 版本,下载即用。这就像你出门本来要带工具箱、发电机、对讲机,结果有人递给你一把瑞士军刀说:都在这了。

但事情没那么简单。一个 PHP 写的服务器,凭什么跟 C 写的 Nginx 叫板?这问题问得好。

内存是 PHP 并发最大的死穴,也是 Qbix 下刀的地方

先看传统方案到底卡在哪。每个 PHP-FPM 工作进程都要独立加载一遍整个框架——类、配置、自动加载器,全来一遍。一个进程吃掉 30 到 60 兆内存。一台 8GB 内存的服务器,刨掉系统开销,能跑的工作进程撑死 160 个。160 就是你的并发天花板。数据库一慢,请求排队,用户干等。这就是 PHP 被说“慢”的真正原因——不是 PHP 执行慢,是内存不够你开足够多的进程来扛并发。

Qbix Server 换了个思路。它先让父进程把框架、类、配置、数据库连接全部加载完,然后再 fork 出工作进程。得益于 Unix 的写时复制技术,所有共享代码在物理内存里只存一份。每个子进程只额外占用大概 200KB 的私有内存。200KB 对 50MB,差了 250 倍。

同样是 1GB 内存,PHP-FPM 能跑 24 个并发 PHP 请求。Qbix Server 能跑 5000 个。同一个硬件,同一份 PHP 代码,并发能力直接翻了两百多倍。这就怪了!

静态文件输给 Nginx,但谁在乎呢

当然有代价!在用 13KB 静态文件做测试时,Nginx 的吞吐量比 Qbix Server 高出 56% 到 73%。这太正常了——Nginx 是纯 C 写的,针对 I/O 做了极致优化。但问题来了:你装 Web 服务器是为了跑 PHP,还是为了传静态文件?静态文件可以扔 CDN,可以扔 Nginx 反代。真正要命的是 PHP 请求。

开启 keep-alive 后,Qbix Server 的静态文件吞吐量反而能超过 Nginx 120% 到 135%。而现代浏览器默认都用 keep-alive。至于 PHP 实际负载,启动时间的节省能让 Qbix Server 比 Nginx 加 PHP-FPM 快 2 到 5 倍。这个账,算得过来。

数据库一堵,差距就从 29 倍拉到 47 倍

光说数字没感觉,看实测。用 4 个工作进程做头对头测试:Octane 跑 439 请求每秒,PHP-FPM 跑 469,Swoole 跑 483。差距不到 7%,大家半斤八两。但 Qbix 的优势不在单进程速度,在你能开的进程数量。

真正的考验来了。模拟 200 个并发请求,数据库响应时间从 10 毫秒逐渐拉到 200 毫秒。数据库一忙,PHP-FPM 的进程全堵在 I/O 等待上。10 毫秒延迟时,Qbix Server 的吞吐量是 PHP-FPM 的 3.4 倍,P50 延迟从 516 毫秒降到 18 毫秒。50 毫秒延迟时,差距拉到 4.5 倍吞吐、44 倍延迟。200 毫秒延迟时,PHP-FPM 的用户平均要等 10 秒才能收到响应。Qbix Server 的用户只等 212 毫秒。同一台机器,同一份代码,同样多的内存,用户体验差了 47 倍。这就是 Qbix 真正解决的东西——PHP 的 10K 并发问题。

三种进程模型,把状态泄漏堵得死死的

Qbix Server 设计了三种执行模型,每种对应不同的使用场景。

HTTP 模型:进程 fork 出来,处理一个请求,然后直接死掉。没有任何状态残留,没有内存泄漏,没有请求间的秘密泄漏。

WebSocket 模型:每个连接一个进程,静态变量在同一个用户的多条消息之间可以持久化。连接断开,进程退出,干干净净。

Room 模型:这是最骚的设计。一个房间一个进程,房间里所有用户的消息都交给同一个进程处理。聊天室、游戏对局、投票统计,所有共享状态都在进程里。房间没人了,进程自动退出。不用写任何清理代码,不会把 A 用户的数据泄漏给 B 用户。

这三种模型共用同一套 PHP 类,全部预加载好,子进程直接拿来用。你往 handlers/ 目录里丢文件就行——api/users/get.php 就是 HTTP GET 请求的处理函数,chat/message.php 就是 WebSocket 消息的处理函数。文件夹即路由,文件名即动作。零配置,零脑力消耗。

两个杀手级功能,Nginx 加 PHP-FPM 做不到

Qbix Server 还有两个传统方案死活做不到的事。

第一个是真正的文件访问控制。传统方案里,如果你想限制某个文件只有登录用户能下载,只能把文件放在公开目录然后用一个不可猜测的 URL。但 URL 一旦被人分享出去,防护就破了。Qbix Server 支持 X-Accel-Redirect——PHP 先检查用户有没有权限,检查通过后服务器再流式传输文件。权限校验和文件服务彻底分开,但又完美配合。

第二个是颗粒级缓存失效。传统页面缓存要么全页缓存,要么全页不缓存。改了一个评论区,整个页面缓存全部作废。Qbix Server 支持 X-Cache-Tree 头,把页面拆成组件,每个组件有自己的内容哈希。改了一个组件,只有依赖它的那些页面部分会失效,其他部分照常缓存。这对动态网站来说,是质的飞跃。

跟 FrankenPHP 和 Swoole 比,Qbix 走了一条完全不同的路

FrankenPHP 用 Go 加 C 实现,打包了 Caddy 的生态,支持自动 HTTPS 和 HTTP/3。Qbix Server 是纯 PHP,零依赖,部署就是一个文件的事。

Swoole 是 PHP 的 C 扩展,需要编译安装,改变了 PHP 的运行模式。Qbix Server 不需要任何扩展,100% 兼容所有 PHP 代码。

但最大的区别在状态隔离。FrankenPHP 和 Swoole 的工作进程是常驻内存的,全局变量和静态属性会在请求之间残留。你写代码时稍微不注意,A 用户的数据就可能出现在 B 用户的请求里。Qbix Server 的 HTTP 模型每次请求都是全新进程,天然隔离。用项目作者的话说:让 PHP 去做事件化编程,是从胜利的 jaws 里夺取失败。PHP 最大的安全优势就是共享无状态架构。Qbix 把这个优势发挥到了极致。

但有一个数据,我到现在没想通

Qbix Server 的 README 里写了一个数据:keep-alive 下静态文件吞吐量超过 Nginx 120% 到 135%。一个 PHP 写的服务器,在传文件这件事上,比 C 写的 Nginx 还快。这不合直觉。Nginx 是业界公认的静态文件之王,Qbix 凭什么?

可能的解释是:keep-alive 下连接复用减少了握手开销,而 Qbix 的内存缓存策略让重复请求直接命中内存。但即便如此,一个纯 PHP 实现能在特定场景下跑赢 C 实现,这件事本身就值得停下来想一想。要么是 Nginx 在 keep-alive 场景下有我们不知道的短板,要么是 Qbix 的缓存策略确实有独到之处。这个数据我没有找到第三方复现。如果你去翻它的 GitHub README,这个 claim 就摆在那,等着有人去验证或打脸。

SEO备选标题:

1. Qbix Server 纯 PHP 服务器:1GB 内存跑 5000 并发,Nginx 加 PHP-FPM 直接被干趴!
2. PHP 写的 Web 服务器 Qbix:数据库卡顿时响应快 47 倍,Nginx 组合拳不灵了!
3. 扔掉 Nginx 和 PHP-FPM 吧:Qbix Server 用 200KB 内存干翻 50MB,并发差 250 倍!
4. Qbix Server 实测:keep-alive 下静态文件超 Nginx 35%,PHP 并发多 100 倍不撒谎!