Skip to main content

Cos’è la classe Lottery

Illuminate\Support\Lottery è una classe di utilità che esprime operazioni basate sulla probabilità con un’API fluent. Permette di scrivere in modo semplice pattern come “esegui un’elaborazione una volta ogni 100 richieste” o “registra i log dettagliati solo per una parte delle richieste”.
L’implementazione si trova in src/Illuminate/Support/Lottery.php. Laravel usa questa classe internamente per la GC delle sessioni, la pulizia dei lock di cache e altro.

Uso di base

Indicare la probabilità come rapporto intero

Con Lottery::odds($chances, $outOf) indichi la probabilità “chancesvincitesuchances vincite su outOf tentativi”.

Indicare la probabilità come decimale

Omettendo $outOf e passando un decimale tra 0.0 e 1.0, il valore viene usato direttamente come probabilità.
Nella forma decimale, se il valore supera 1.0 viene sollevata una RuntimeException.

Restituire un booleano senza callback

Se non imposti winner / loser, choose() restituisce true in caso di vincita e false in caso di perdita.

Eseguire più volte

Passando il numero di ripetizioni a choose($times) ottieni un array di risultati.

Passarlo come callable

L’istanza Lottery implementa __invoke, quindi la puoi passare direttamente alle API che accettano un callable.

Casi d’uso pratici

1. Prune della cache (eseguito 1 volta su 100)

Ideale per operazioni di manutenzione che non è necessario eseguire sempre, come la rimozione dei record scaduti.

2. Sampling telemetrico (log dettagliati solo su una parte delle richieste)

Se registrare a log tutte le richieste è troppo costoso, puoi usarlo per il sampling.

3. Comportamento tipo A/B test

Distribuisci probabilisticamente gli utenti su due percorsi di codice.

4. Esecuzione randomizzata di task periodici a supporto dello scheduler

Utile quando vuoi eseguire un task in modo casuale su più server evitando esecuzioni duplicate.

Pattern probabilistici nel framework Laravel

Laravel usa ampiamente pattern probabilistici anche internamente per operazioni di manutenzione. Alcune implementazioni, scritte prima dell’introduzione della classe Lottery, usano direttamente random_int(), ma seguono la stessa idea.
1

Session: garbage collection

Illuminate\Session\Middleware\StartSession::configHitsLottery() usa l’impostazione lottery di config/session.php ed esegue la GC verificando la probabilità con random_int.
2

DatabaseLock: prune dei lock scaduti

Illuminate\Cache\DatabaseLock::acquire() a ogni acquisizione applica lo stesso pattern probabilistico per rimuovere i lock scaduti.
3

DB::whenQueryingForLongerThan — passare un'istanza Lottery

Poiché un’istanza Lottery è callable, puoi usarla direttamente come callback di rilevamento delle query lente.
Session e DatabaseLock usano direttamente random_int(), mentre la classe Lottery ti permette di controllare il risultato nei test con alwaysWin() / alwaysLose() / fix(). Nello sviluppo di pacchetti la scelta di Lottery migliora la testabilità.

Utilizzo nei test

Per testare codice che dipende dalla casualità usa le API di test fornite da Lottery.

Lottery::alwaysWin() — vinci sempre

Lottery::alwaysLose() — perdi sempre

Lottery::fix() — fissare il risultato con una sequenza

Puoi controllare l’esito di più chiamate con un array di true/false.
alwaysWin() / alwaysLose() / fix() modificano proprietà statiche globali. Chiama sempre Lottery::determineResultNormally() nel tearDown() del test.

Lottery::setResultFactory() — iniettare una factory personalizzata

Se serve un controllo più fine usa una factory personalizzata.

Utilizzo nello sviluppo di pacchetti

Registrazione nel service provider

Quando integri elaborazioni di manutenzione nel service provider di un pacchetto, usa Lottery per distribuire il carico.

Leggere gli odds dalla configurazione

Rendendo la probabilità modificabile dal file di configurazione, gli utenti possono regolarla facilmente.

Sampling nel middleware

API reference

Pagine correlate

Trait Macroable

Impara il pattern di estensione per aggiungere metodi a classi esistenti.

Trait Conditionable

Impara a progettare catene condizionali con when() / unless().
Ultima modifica il 13 luglio 2026