Qbix Server est un serveur web en pur PHP qui rend inutile la pile traditionnelle Nginx + php-fpm. Au lieu de générer des workers PHP distincts chargeant indépendamment le framework entier, le serveur charge une fois au démarrage toutes les classes, configurations et connexions de base de données, puis fork des processus worker. Les workers forkés héritent de l'état préchargé via partage de mémoire copy-on-write, évitant la duplication.
La revendication de concurrence repose sur l'efficacité mémoire. Le php-fpm classique alloue 30–60MB par worker pour un code framework identique sur tous les workers. Sur un serveur de 8GB, cela limite à environ 160 workers simultanés. Qbix Server charge ce code une fois (~30MB partagé), puis chaque worker ajoute seulement ~5MB de données par requête, permettant ~1.600 workers sur le même matériel.
Les benchmarks de performance sur un conteneur single-core (PHP 8.3, fichier statique 13KB) montrent que Qbix Server délivre 56–73% du débit Nginx selon le mode de concurrence et les paramètres keep-alive. La documentation reconnaît que cet écart est inhérent : Nginx utilise sendfile() I/O kernel-space, notification d'événement epoll, et C compilé, tandis que Qbix s'exécute en PHP interprété avec stream_select et traitement de fichiers en userspace.
Les fonctionnalités clés incluent la mise en cache des réponses en mémoire avec validation ETag et 304, X-Accel-Redirect pour la gestion d'accès aux fichiers (PHP vérifie les permissions, le serveur stream le fichier sans URL publique), et X-Cache-Tree pour l'invalidation de cache au niveau des composants (invalider un composant de page sans vider la page entière). Le support WebSocket est intégré.
L'architecture utilise fork-par-requête (ou pools de worker pré-forkés avec --workers=N). Chaque requête s'exécute dans son propre processus, éliminant les fuites d'état – les variables globales, propriétés statiques et connexions de base de données sont effacées à la fin du processus. Ceci contraste avec les systèmes de workers persistants comme FrankenPHP et Swoole, où l'état statique peut fuir entre requêtes non liées sans audit minutieux.
Le serveur est distribué sous forme de code source PHP, fichier PHAR de 196KB, ou binaire statique (~15MB) incluant PHP 8.3 et extensions. Il nécessite PHP 8.1+ avec extensions sockets, pcntl (pour signaux et workers sur Unix), et openssl. Le support Windows existe sans pcntl ; chaque requête spawn via proc_open avec ~50ms de surcharge, sacrifiant l'avantage de vitesse du préchargement.
Opérationnellement, installer amphp via Composer upgrade la couche transport vers HTTP/2 avec multiplexing, compression d'en-têtes HPACK, et server push. Le transport intégré utilise stream_select sans dépendances.
Le serveur inclut une couche micro-framework : classes/ (autoloadées), handlers/ (déclenchées par événement à la demande), views/ (templates PHP), config/ (paramètres JSON), web/ (document root public). La même structure de répertoires est utilisée par la plateforme Qbix complète, permettant aux projets d'upgrades ultérieurs sans réorganisation.
Pour les sites simples, APIs, ou projets ne nécessitant pas un framework complet, Qbix Server s'exécute en mode autonome (sans drapeau --app). Avec --app=/chemin/vers/qbix-app, il intègre la plateforme Qbix complète, routant les requêtes via le dispatcher du framework et chargeant les plugins comme Users, Streams, et Assets.
Le serveur fait partie de l'écosystème Qbix Platform et est publié sous licence MIT.