Qu’est-ce que la classe Lottery
Illuminate\Support\Lottery est une classe utilitaire qui permet d’exprimer des opérations basées sur des probabilités via une API fluide. Elle permet d’écrire simplement des schémas tels que « exécuter un traitement une fois toutes les 100 requêtes » ou « ne journaliser en détail qu’une partie des requêtes ».
L’implémentation se trouve dans
src/Illuminate/Support/Lottery.php. Laravel l’utilise également en interne, par exemple pour le garbage collector de session ou l’élagage des verrous de cache.Utilisation de base
Spécifier la probabilité avec un ratio entier
Lottery::odds($chances, $outOf) définit la probabilité « outOf ».
Spécifier la probabilité avec un décimal
Si$outOf est omis et qu’un décimal entre 0.0 et 1.0 est passé, il est utilisé tel quel comme probabilité.
Retourner un booléen sans callback
Sans winner / loser définis,choose() retourne true en cas de gain et false en cas de perte.
Exécuter plusieurs fois
Passer un nombre àchoose($times) retourne un tableau de résultats.
Passer comme callable
L’instanceLottery implémente __invoke et peut donc être passée directement à une API attendant un callable.
Cas d’utilisation concrets
1. Élagage du cache (une fois sur cent)
Idéal pour les opérations de maintenance sans nécessité d’exécution systématique, comme la suppression d’enregistrements expirés.2. Échantillonnage de télémétrie (log détaillé sur une partie des requêtes)
Utile quand journaliser toutes les requêtes serait coûteux.3. Comportement de type A/B testing
Répartit les utilisateurs de manière probabiliste entre deux chemins de code.4. En complément du Scheduler pour exécuter aléatoirement une tâche périodique
Utile pour éviter les exécutions redondantes sur plusieurs serveurs tout en exécutant aléatoirement une tâche.Schémas probabilistes dans le framework Laravel
Laravel utilise abondamment des traitements de maintenance probabilistes en interne. Certaines implémentations, antérieures à la classeLottery, utilisent directement random_int(), mais reposent sur la même idée.
Session : ramasse-miettes
Illuminate\Session\Middleware\StartSession::configHitsLottery() s’appuie sur la configuration lottery de config/session.php et utilise random_int pour décider probabilistiquement d’exécuter le GC.DatabaseLock : élagage des verrous expirés
Illuminate\Cache\DatabaseLock::acquire() applique le même ratio à chaque acquisition de verrou pour supprimer les verrous expirés.Utilisation pendant les tests
Pour tester du code intégrant de l’aléatoire, servez-vous des API de test fournies parLottery.
Lottery::alwaysWin() — toujours gagnant
Lottery::alwaysLose() — toujours perdant
Lottery::fix() — fixer les résultats par séquence
Vous pouvez contrôler les résultats de plusieurs appels avec un tableau de true/false.
Lottery::setResultFactory() — injecter une fabrique personnalisée
Pour un contrôle plus fin, utilisez une fabrique personnalisée.
Utilisation en développement de packages
Enregistrement dans un service provider
Pour intégrer un traitement de maintenance dans le service provider d’un package,Lottery permet d’en répartir la charge.
Charger la probabilité depuis la configuration
Rendre la probabilité configurable via un fichier facilite l’ajustement par l’utilisateur.Échantillonnage dans un middleware
Référence API
| Méthode | Description |
|---|---|
Lottery::odds($chances, $outOf) | Fabrique statique qui crée une instance Lottery |
->winner(callable $callback) | Définit le callback en cas de gain |
->loser(callable $callback) | Définit le callback en cas de perte |
->choose($times = null) | Exécute Lottery. Un tableau est retourné si $times est spécifié |
Lottery::alwaysWin($callback) | Pour les tests : toujours gagner |
Lottery::alwaysLose($callback) | Pour les tests : toujours perdre |
Lottery::fix($sequence) | Pour les tests : fixer les résultats en séquence |
Lottery::determineResultNormally() | Réinitialise la fixation utilisée pour les tests |
Lottery::setResultFactory(callable) | Injecte une logique de décision personnalisée |
Pages associées
Trait Macroable
Découvrez le pattern d’extension permettant d’ajouter des méthodes à une classe existante.
Trait Conditionable
Découvrez la conception de chaînes de branchement conditionnel avec
when() / unless().