Processus persistants : workers de files d'attente, Horizon et vos programmes toujours en marche
Certaines applications ont besoin de quelque chose qui n'existait pas sur un hébergement mutualisé : un programme qui ne s'arrête jamais. Un worker qui traite la file d'attente dès qu'une tâche arrive, Horizon, un consommateur de messages ou un bot.
Jusqu'ici, la solution était une tâche cron. Dans Laravel, le scheduler lance chaque minute un queue:work --stop-when-empty, qui traite ce qui est en attente puis s'arrête. Cela fonctionne, mais un e-mail de bienvenue peut mettre jusqu'à une minute à partir, et ce qui doit rester actif en permanence, comme Horizon, n'avait pas de place.
Désormais, sur les offres Avanza, Max et Elastic, vous disposez de processus persistants : des programmes que votre compte maintient toujours en marche.
Ce que vous pouvez laisser tourner
Dans Hébergement → votre service → Outils → Processus, il y a un nouveau bloc, Processus persistants. Cliquez sur Ajouter un processus et choisissez :
- Worker de files d'attente :
php artisan queue:workavec les files que vous indiquez, par ordre de priorité. Si les tâches s'accumulent, vous pouvez en mettre plusieurs sur les mêmes files. - Horizon :
php artisan horizon, qui répartit ses propres workers et apporte son tableau de bord et ses métriques. - Commande personnalisée : une ligne de shell pour Symfony Messenger, un consommateur de messages, un bot ou tout programme qui travaille en arrière-plan.
Vous indiquez le dossier de l'application et, pour le worker et Horizon, la version de PHP avec laquelle ils doivent tourner. En moins d'une minute, le processus passe de Démarrage à En marche.
Avanza accepte 3 processus, Max 5 et Elastic 8.
S'il s'arrête, il redémarre tout seul
Un superviseur vérifie chaque minute les processus du compte et redémarre celui qui est arrêté. Si le programme se termine de lui-même, par exemple quand un worker atteint son --max-time pour libérer de la mémoire, il redémarre en une seconde et prend la version publiée à ce moment-là.
En revanche, il n'insiste pas indéfiniment. Si un processus s'arrête cinq fois de suite juste après son démarrage, il passe En échec et attend que vous le redémarriez, pour ne pas consommer le CPU de votre compte pour quelque chose qui ne peut pas démarrer.
Pour savoir pourquoi, chaque processus a son journal, avec une ligne à chaque démarrage et une autre à chaque arrêt. Presque toujours, la ligne qui précède chaque arrêt en explique la cause : un dossier mal saisi, une extension PHP manquante ou un service que l'application n'arrive pas à joindre. Vous corrigez et cliquez sur Redémarrer.
Depuis le même panneau, vous pouvez les arrêter, les démarrer, les modifier ou les supprimer. Tout tourne avec l'utilisateur de votre compte et dans la limite de ses ressources, les mêmes que celles de vos sites.
Avec Deploy+, sans penser à redémarrer
Un worker charge le code au démarrage et le garde en mémoire : après avoir publié une nouvelle version, il faut donc le redémarrer. Avec Deploy+, vous n'avez rien à faire : à la fin de chaque déploiement, et aussi lors d'un retour à une version précédente, il redémarre les processus persistants de cette application. Chaque worker termine la tâche en cours et redémarre avec le nouveau code, et le journal du déploiement indique l'état de chacun.
Si vous connectez un projet Laravel, l'assistant de Deploy+ vous propose lui-même de laisser son worker de files d'attente en marche, avec le dossier déjà renseigné.
Ce qui n'est pas couvert
Un processus persistant sert au travail en arrière-plan. Il n'est pas prévu pour les programmes qui écoutent sur un port, comme un serveur Node.js, une application Python ou Laravel Reverb. Pour les WebSockets dans Laravel, nous vous recommandons un service compatible avec Pusher, comme Ably ou Pusher lui-même, que Laravel prend en charge nativement ; nous l'expliquons dans WebSockets dans Laravel. Si votre projet a besoin de son propre serveur, il vous faut un VPS.
Sur Inicia, Webmaster et les comptes d'un hébergement multi-comptes, il n'y a pas de processus persistants. Les files d'attente peuvent toujours être traitées avec le scheduler, avec jusqu'à une minute d'attente.
Si vous utilisez Horizon ou voulez vos files d'attente dans Redis, découvrez aussi le Redis persistant, qui arrive en même temps. Et vous trouverez le pas à pas, avec les états, les options de chaque type et la marche à suivre si l'un d'eux reste en échec, dans le guide des processus persistants.