Skip to main content

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é « chancesgainssurchances gains sur 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é.
En cas de spécification décimale, une valeur supérieure à 1.0 lève une RuntimeException.

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’instance Lottery 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 classe Lottery, utilisent directement random_int(), mais reposent sur la même idée.
1

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.
2

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.
3

DB::whenQueryingForLongerThan — exemple avec la classe Lottery

Comme une instance Lottery peut être passée en tant que callable, elle s’intègre directement au callback de détection de requêtes lentes.
Alors que Session et DatabaseLock utilisent directement random_int(), la classe Lottery offre l’avantage de pouvoir maîtriser les résultats en tests avec alwaysWin() / alwaysLose() / fix(). En développement de packages, choisir Lottery améliore la testabilité.

Utilisation pendant les tests

Pour tester du code intégrant de l’aléatoire, servez-vous des API de test fournies par Lottery.

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.
alwaysWin() / alwaysLose() / fix() modifient des propriétés statiques globales. Appelez impérativement Lottery::determineResultNormally() dans le tearDown() du test.

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

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().
Dernière modification le 13 juillet 2026