Maison  >  Questions et réponses  >  le corps du texte

Le verrouillage du cache Laravel est déjà verrouillé ?

TLDR : Comment vérifier si un verrou atomique Laravel est verrouillé sans le verrouiller et vérifier la valeur de retour de l'appel $lock->get() ?

J'ai plusieurs commandes Laravel qui sont exécutées via le planificateur. Une commande n'est pas planifiée et si elle est en cours d'exécution, aucune autre commande ne doit être exécutée. J'ai donc introduit le verrouillage du cache atomique de Laravel comme ceci :

private function checkSetupRunning(){
    $lock = Cache::store('locks')->getStore()->lock(
        self::RUNNING_KEY, // name for the lock
        owner: self::class
    );

    if ($lock->get(fn() => null) === false) {
        throw new SetupRunningException();
    }
}

Cela fonctionne comme prévu, cependant, lors de l'exécution de plusieurs de ces commandes en parallèle, il semble parfois que le verrou ait été acquis via la fonction checkSetupRunning d'une autre commande et échoue donc, même si la commande de configuration n'est pas en cours d'exécution.

J'ai donc besoin d'un moyen de vérifier si le verrou a été acquis sans verrouiller le verrou. J'ai vérifié la documentation et du code mais je n'ai pas trouvé de solution.

P粉818561682P粉818561682226 Il y a quelques jours476

répondre à tous(1)je répondrai

  • P粉604507867

    P粉6045078672024-03-28 12:32:45

    C'est ainsi que nous l'avons trouvé

     public static function getCacheLockOwner(string $key): string|false
     {
            return Cache::lockConnection()->client()->get(Cache::getPrefix().$key);
     }
    

    Il renvoie le propriétaire du verrou (une chaîne) s'il est présent, false sinon.

    répondre
    0
  • Annulerrépondre