Le verrouillage du cache Laravel est déjà verrouillé ?
P粉818561682
P粉818561682 2024-03-27 13:28:19
0
1
483

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粉818561682
P粉818561682

répondre à tous(1)
P粉604507867

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!