Principe du redémarrage en douceur
Qu'est-ce que le redémarrage en douceur ?
Le redémarrage en douceur est différent d'un redémarrage standard ; il permet de redémarrer un service (généralement lié aux connexions courtes) sans affecter les utilisateurs, afin de recharger le programme PHP et de compléter les mises à jour du code métier.
Le redémarrage en douceur est généralement appliqué lors de la mise à jour de l'activité ou de la publication de versions, évitant ainsi l'impact d'une indisponibilité temporaire des services due à un redémarrage lors de la publication du code.
Attention
Le système Windows ne prend pas en charge le reload.Attention
Pour les activités utilisant des connexions longues (par exemple, websocket), les connexions seront interrompues lors du redémarrage en douceur des processus. La solution consiste à utiliser une architecture similaire à gatewayWorker, où un groupe de processus est spécialement chargé de maintenir les connexions, et où l’attribut reloadable de ce groupe de processus est défini sur false. La logique métier démarre un autre groupe de processus worker pour le traitement, et le gateway communique avec les processus worker via TCP. Lorsqu'une modification de l'activité est nécessaire, il suffit de redémarrer les processus worker.
Restrictions
Attention : seuls les fichiers chargés dans le rappel on{...} après un redémarrage en douceur seront automatiquement mis à jour ; les fichiers chargés directement dans le script de démarrage ou du code écrit en dur ne seront pas automatiquement mis à jour lors de l'exécution de reload.
Le code suivant ne sera pas mis à jour après un reload
$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function($connection, $request) {
$connection->send('hi'); // Le code écrit en dur ne prend pas en charge la mise à jour à chaud
};
$worker = new Worker('http://0.0.0.0:1234');
require_once __DIR__ . '/your/path/MessageHandler.php'; // Les fichiers chargés directement dans le script de démarrage ne prennent pas en charge la mise à jour à chaud
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage']; // Supposons que la classe MessageHandler ait une méthode onMessage
Le code suivant sera automatiquement mis à jour après un reload
$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart est le rappel déclenché après le démarrage du processus
require_once __DIR__ . '/your/path/MessageHandler.php'; // Les fichiers chargés après le démarrage du processus prennent en charge la mise à jour à chaud
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage'];
};
Après modification de MessageHandler.php, exécutez php start.php reload, et MessageHandler.php sera rechargé en mémoire, permettant ainsi la mise à jour de la logique métier.
Astuce
Le code ci-dessus utilise l'instructionrequire_oncepour des raisons de démonstration ; si votre projet prend en charge le chargement automatique PSR-4, il n'est pas nécessaire d'appeler l'instructionrequire_once.
Principe du redémarrage en douceur
Workerman se compose d'un processus principal et de processus enfants. Le processus principal est responsable de la surveillance des processus enfants, qui eux reçoivent les connexions des clients et les données de requête envoyées, traitent ces données et renvoient les résultats aux clients. Lors de la mise à jour du code métier, il suffit d'actualiser les processus enfants pour atteindre l'objectif de mise à jour du code.
Lorsque le processus principal de Workerman reçoit un signal de redémarrage en douceur, il envoie un signal de sortie sécurisée à l'un des processus enfants (permettant au processus concerné de terminer la requête actuelle avant de quitter). Une fois ce processus sorti, le processus principal recrée un nouveau processus enfant (ce processus enfants charge le nouveau code PHP), puis envoie à un autre ancien processus une commande d'arrêt, redémarrant ainsi les processus un par un jusqu'à ce que tous les anciens processus soient remplacés.
Nous constatons ici que le redémarrage en douceur consiste en réalité à permettre aux anciens processus métier de quitter un par un, puis de créer des nouveaux processus un par un. Pour ne pas affecter les utilisateurs lors du redémarrage en douceur, il est nécessaire de ne pas conserver d'informations d'état liées à l'utilisateur dans les processus, ce qui signifie que les processus métier doivent de préférence être sans état, évitant ainsi les pertes d'informations dues à la sortie des processus.