Caractéristiques de Workerman
1. Développement en pur PHP
Les applications développées avec Workerman peuvent s'exécuter de manière autonome sans dépendre de php-fpm, apache ou nginx. Cela facilite grandement le développement, le déploiement et le débogage pour les développeurs PHP.
2. Prise en charge de PHP multithread
Pour tirer pleinement parti de la performance des serveurs multi-CPU, Workerman prend en charge par défaut le multi-processus et le multitâche. Workerman démarre un processus principal et plusieurs processus enfants pour fournir des services, le processus principal surveillant les processus enfants, qui écoutent les connexions réseau, reçoivent, envoient et traitent les données de manière indépendante. Ce modèle de processus simple rend Workerman plus stable et plus efficace.
3. Prise en charge de TCP et UDP
Workerman prend en charge les protocoles de transport TCP et UDP, il suffit de modifier un attribut pour changer le protocole de transport, sans besoin de modifier le code métier.
4. Prise en charge des connexions persistantes
Il est souvent nécessaire que les applications PHP maintiennent des connexions persistantes avec les clients, comme dans les chat rooms, les jeux, etc. Cependant, les conteneurs PHP traditionnels (apache, nginx, php-fpm) ont du mal à le faire. Avec Workerman, tant que la logique métier côté serveur n'appelle pas explicitement l'interface de fermeture de connexion, il est possible d'utiliser des connexions persistantes PHP. Un seul processus Workerman peut gérer des dizaines de milliers de connexions simultanées, et avec plusieurs processus, il peut en supporter des centaines de milliers, voire des millions.
5. Prise en charge de divers protocoles de couche application
Workerman prend en charge divers protocoles de couche application, y compris les protocoles personnalisés. Changer de protocole dans Workerman est également très simple, il suffit de configurer un champ, et le protocole change automatiquement, sans modification du code métier. Il est même possible d'activer plusieurs ports avec différents protocoles pour répondre aux besoins variés des clients.
6. Prise en charge de la haute concurrence
Workerman prend en charge la bibliothèque d'événements Libevent (nécessite l'installation de l'extension event). Utiliser Event lors de connexions persistantes à forte concurrence offre des performances exceptionnelles. Si l'extension Event n'est pas installée, Workerman utilise les appels système Select intégrés à PHP, qui offrent également des performances robustes.
7. Prise en charge du redémarrage en douceur du service
Lorsque le service doit être redémarré (par exemple, lors de la publication d'une version), nous ne voulons pas que les processus en cours de traitement des demandes des utilisateurs soient immédiatement terminés, et encore moins que le redémarrage provoque une interruption de la communication avec le client. Workerman fournit une fonction de redémarrage en douceur qui garantit une mise à niveau fluide du service sans affecter l'utilisation par le client.
8. Prise en charge de la détection des mises à jour de fichiers et du rechargement automatique
Au cours du développement, nous souhaitons que les modifications apportées au code prennent effet immédiatement pour voir les résultats. Workerman propose le composant de surveillance de fichiers FileMonitor, qui exécute automatiquement un reload dès qu'un fichier est mis à jour, permettant ainsi de charger les nouveaux fichiers et de les rendre effectifs.
9. Prise en charge de l'exécution des processus enfants sous un utilisateur spécifié
Puisque les processus enfants traitent réellement les demandes des utilisateurs, pour des raisons de sécurité, ces processus ne doivent pas avoir trop de privilèges. C'est pourquoi Workerman prend en charge la définition d'un utilisateur sous lequel les processus enfants s'exécutent, rendant ainsi votre serveur plus sûr.
10. Prise en charge de la conservation permanente des objets ou des ressources
Workerman ne charge et ne parse un fichier PHP qu'une seule fois au cours de son exécution, ce qui le garde en mémoire. Cela signifie que les déclarations de classes et de fonctions, l'environnement d'exécution PHP, la table des symboles, etc., ne seront pas recréés ou détruits. Dans Workerman, les membres statiques ou les variables globales d'un processus sont conservés pendant toute la durée de vie de celui-ci à moins qu'ils ne soient explicitement détruits. Par exemple, si une connexion à la base de données est initialisée une fois dans un processus, toutes les demandes futures de ce processus peuvent réutiliser cette connexion, évitant ainsi les trois étapes de l'établissement de la connexion TCP, la vérification des autorisations de la base de données et les quatre étapes de terminaison TCP lors de la déconnexion, ce qui améliore considérablement l'efficacité de l'application.
11. Haute performance
Comme le fichier PHP est lu depuis le disque une fois et reste en mémoire, il est directement utilisé lors de la prochaine utilisation à partir de l'opcode en mémoire. Cela réduit considérablement l'E/S disque et de nombreux processus qui consomment du temps dans PHP, tels que l'initialisation de la demande, la création d'un environnement d'exécution, l'analyse lexicale, l'analyse syntaxique, la compilation de l'opcode, et la fermeture de la demande. De plus, il ne dépend pas de conteneurs comme nginx ou apache, réduit les frais de communication entre nginx et PHP, et surtout, les ressources peuvent être conservées de manière permanente, évitant ainsi la nécessité de chaque fois d'initialiser la connexion à la base de données, etc. Ainsi, les applications développées avec Workerman offrent des performances très élevées.
12. Prise en charge de HHVM
Workerman prend en charge l'exécution sur la machine virtuelle HHVM, ce qui peut multiplier les performances de PHP. Cela est particulièrement efficace dans les tâches de calcul intensif. Des tests de stress ont montré que, sans charge de travail, Workerman exécuté sous HHVM avait une capacité de passage réseau supérieure de 30 à 80 % par rapport à Zend PHP 5.6.