Performances et surveillance

Redis persistant pour les files d'attente, les sessions et Horizon

Vérifié le 14 min de lecture Redis files d'attente sessions Laravel

Redis Cache est un cache : il repart à vide à chaque redémarrage et écarte des clés lorsqu'il est plein. Il sert à garder ce que l'application peut recalculer, pas une file de tâches en attente ni la session d'un utilisateur. C'est le rôle du Redis persistant : une instance propre à votre compte qui enregistre ses données sur disque et ne les écarte pas lorsqu'elle est pleine.

Il s'agit de Valkey 8, compatible avec Redis : les mêmes commandes et les mêmes clients, comme PhpRedis, fonctionnent. Il est disponible dans les offres Avanza, Max et Elastic.

Redis Cache ou Redis persistant

Redis Cache Redis persistant
Dans toutes les offres Dans Avanza, Max et Elastic
Pour le cache Pour les files d'attente, les sessions et Horizon
De 16 à 200 Mo, selon l'offre De 64 à 512 Mo, au choix
Au redémarrage, repart à vide Au redémarrage, conserve ses données
Une fois plein, écarte des clés Une fois plein, refuse les écritures
Hors des sauvegardes Dans les sauvegardes quotidiennes

Redis Cache se connecte par /tmp/redis.sock ; le Redis persistant, par /home/USUARIO/.hostsuar/redis/redis.sock, avec votre utilisateur cPanel à la place de USUARIO. La mémoire de Redis Cache dépend de l'offre ; celle du persistant, c'est vous qui la choisissez, jusqu'à 128 Mo dans Avanza, 256 Mo dans Max et 512 Mo dans Elastic.

Vous pouvez utiliser les deux en même temps : le cache dans Redis Cache, les files d'attente et les sessions dans le Redis persistant. Nous l'expliquons plus bas.

Dans les deux cas, le port est 0 : la connexion se fait par socket, sans accès réseau. L'application doit s'exécuter sur l'hébergement lui-même.

L'activer

  1. Dans l'espace client, ouvrez Hébergement, entrez dans votre service et allez dans Gestionnaire de paquets.
  2. Sur la carte Redis persistant, cliquez sur Activer.
  3. Vérifiez la mémoire, la persistance et le comportement une fois plein. Les valeurs par défaut conviennent aux files d'attente, aux sessions et à Horizon.
  4. Confirmez et attendez que le panneau l'affiche en marche.

Le Redis persistant occupe l'un des processus persistants de l'offre et apparaît aussi dans Outils > Processus. Chaque compte en a un ; si tous les processus de votre offre sont déjà occupés, supprimez-en un avant de l'activer.

Il s'exécute avec l'utilisateur de votre compte et dans ses ressources. Seul cet utilisateur peut ouvrir le socket : il n'a donc pas besoin de mot de passe.

Réglages

Mémoire. 64 Mo par défaut, avec un maximum de 128 Mo dans Avanza, 256 Mo dans Max et 512 Mo dans Elastic. Les files d'attente et les sessions prennent peu de place : 64 Mo suffisent pour la plupart des applications. Avec Horizon, la mémoire augmente avec les métriques et les tâches récentes qu'il conserve ; elles se règlent dans trim, dans config/horizon.php.

Persistance.

  • Toutes les secondes (par défaut) : écrit chaque modification dans un fichier journal (AOF) et l'envoie sur le disque chaque seconde. En cas de coupure, on perd au plus la dernière seconde. C'est celle dont ont besoin les files d'attente et les sessions.
  • Sans persistance : tout reste en mémoire et un redémarrage le vide. Ne l'utilisez que si vous stockez des données que vous pouvez régénérer.

Ce qu'il enregistre sur disque se trouve dans ~/.hostsuar/redis/datos et compte dans l'espace de votre offre, même lorsque Redis est arrêté. La carte du Gestionnaire de paquets indique la place occupée, à côté de la mémoire. Les files d'attente et les sessions se limitent généralement à quelques mégaoctets : le fichier journal se compacte tout seul lorsqu'il grossit.

Une fois plein.

  • Ne pas perdre de données (par défaut) : lorsqu'il atteint la limite, il refuse les nouvelles écritures avec une erreur et ne supprime rien. C'est l'option pour les files d'attente, les sessions et Horizon : l'application signale l'erreur au lieu de perdre une tâche sans que personne ne le sache.
  • Écarter le moins utilisé : supprime les clés les moins utilisées pour faire de la place. Uniquement pour le cache ; avec des files d'attente ou des sessions, vous perdriez des tâches et déconnecteriez des utilisateurs.

Modifier les réglages redémarre Redis. Avec Toutes les secondes, il récupère ses données au retour ; si vous passez à Sans persistance, il démarre à vide.

Actions

  • Réglages : modifie la mémoire, la persistance et le comportement une fois plein.
  • Redémarrer : l'arrête puis le relance. Avec la persistance, les données sont conservées.
  • Vider : supprime tout ce qu'il contient, dans toutes ses bases : tâches en attente des files, sessions ouvertes (les utilisateurs devront se reconnecter) et métriques de Horizon. Cette action est irréversible.
  • Désactiver : l'arrête et le retire, ce qui libère sa place de processus persistant. L'application perdra la connexion : modifiez d'abord son .env. Les données enregistrées restent sur votre compte au cas où vous le réactiveriez, sauf si vous cochez Supprimer aussi ce qu'il a enregistré.

Vous pouvez vérifier qu'il répond en SSH, avec votre utilisateur à la place de USUARIO :

valkey-cli -s /home/USUARIO/.hostsuar/redis/redis.sock ping
valkey-cli -s /home/USUARIO/.hostsuar/redis/redis.sock info memory

La première commande répond PONG ; la seconde affiche la mémoire utilisée (used_memory_human) et la limite (maxmemory_human).

Le connecter depuis Laravel

Activez l'extension redis (PhpRedis) dans la version de PHP de l'application et, si vos workers utilisent une autre version, dans celle-ci aussi. Ensuite, dans le .env :

REDIS_CLIENT=phpredis
REDIS_HOST=/home/USUARIO/.hostsuar/redis/redis.sock
REDIS_PORT=0
REDIS_PASSWORD=null

QUEUE_CONNECTION=redis
SESSION_DRIVER=redis

Remplacez USUARIO par votre utilisateur cPanel. Avec Deploy+, modifiez le .env depuis le menu du dépôt ; si vous mettez la configuration en cache, exécutez de nouveau php artisan config:cache ou redéployez. Vérifiez la connexion :

php artisan tinker --execute="dump(Illuminate\Support\Facades\Redis::connection()->ping());"

Le résultat doit être true.

Avant de changer de connexion, tenez compte de ce qui existe déjà :

  • Files d'attente : les tâches en attente dans la base de données ne passent pas dans Redis. Laissez la file de la base de données se vider avant de changer QUEUE_CONNECTION, ou gardez un moment un worker sur la connexion database.
  • Sessions : les sessions enregistrées dans la base de données ne sont pas transférées. En changeant SESSION_DRIVER, les utilisateurs devront se reconnecter.

Pour traiter les files d'attente, il faut un worker en marche : créez-le dans Outils > Processus comme Worker de files d'attente ou utilisez Horizon. Tout est expliqué dans processus persistants.

Avec Redis Cache en même temps

Si vous voulez le cache dans Redis Cache et le reste dans le Redis persistant, faites en sorte que la connexion cache de config/database.php lise ses propres variables. Dans la connexion cache, modifiez l'hôte et le port :

'host' => env('REDIS_CACHE_HOST', env('REDIS_HOST', '127.0.0.1')),
'port' => env('REDIS_CACHE_PORT', env('REDIS_PORT', '6379')),

Et dans le .env :

REDIS_HOST=/home/USUARIO/.hostsuar/redis/redis.sock
REDIS_PORT=0
REDIS_CACHE_HOST=/tmp/redis.sock
REDIS_CACHE_PORT=0
CACHE_STORE=redis

Le store redis de config/cache.php utilise la connexion cache pour les données et la connexion default pour les verrous : les verrous de Cache::lock() et withoutOverlapping() restent donc dans le Redis persistant, qui ne les écarte pas.

Si vous n'avez que le Redis persistant, laissez le cache dans la base de données ou, si vous le mettez dans Redis, donnez une expiration à ce que vous y stockez : avec Ne pas perdre de données, un cache qui grossit sans expirer finit par remplir la mémoire et par bloquer aussi les files d'attente.

Horizon

Horizon a besoin de files d'attente dans Redis et d'un processus qui le maintienne en marche :

  1. Activez le Redis persistant et connectez Laravel comme dans la section précédente, avec QUEUE_CONNECTION=redis.
  2. Installez Horizon dans votre projet avec composer require laravel/horizon et php artisan horizon:install. Il a besoin des extensions pcntl et posix : si Composer signale qu'elles manquent, activez-les dans la version de PHP que vous allez utiliser.
  3. Vérifiez config/horizon.php. Le superviseur de production accepte par défaut jusqu'à 10 workers, et chacun occupe sa mémoire dans les ressources de votre compte : ajustez maxProcesses aux besoins de votre application, par exemple 2 ou 3 dans Avanza.
  4. Décidez qui peut voir le panneau /horizon dans la méthode gate() de app/Providers/HorizonServiceProvider.php. En dehors de l'environnement local, seules les personnes autorisées à cet endroit y ont accès.
  5. Dans Outils > Processus, ajoutez un processus de type Horizon avec le dossier de l'application et sa version de PHP. Ne créez pas en plus un worker de files d'attente pour les mêmes files.
  6. Si vous publiez avec Deploy+, n'ajoutez rien au script : après l'activation de chaque version, et aussi lors d'un retour à une version précédente, il redémarre le processus Horizon de cette application. Le script s'exécute avant l'activation de la version : un horizon:terminate lancé depuis celui-ci ferait redémarrer Horizon sur l'ancienne. Si vous publiez autrement, exécutez php artisan horizon:terminate une fois le nouveau code en place.
  7. Si vous voulez les graphiques de métriques, planifiez horizon:snapshot toutes les cinq minutes dans routes/console.php :
use Illuminate\Support\Facades\Schedule;

Schedule::command('horizon:snapshot')->everyFiveMinutes();

Horizon avec Redis Cache n'est pas sûr : si ce cache se vide ou se remplit, des tâches en attente sont perdues.

Sauvegardes

Les données se trouvent sur votre compte, dans ~/.hostsuar/redis/, et sont incluses dans les sauvegardes quotidiennes comme le reste de vos fichiers.

Restaurer ce dossier ramène Redis à l'état de ce jour-là : les tâches alors en attente reviendraient dans la file, même si elles ont été traitées depuis. Si vous devez le restaurer, arrêtez d'abord le Redis persistant depuis Outils > Processus et relancez-le une fois la restauration terminée.

Cela peut aussi vous aider

Quelque chose cloche ou a changé ? Racontez-nous et nous le vérifions.