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
ConLottery::odds($chances, $outOf) indichi la probabilità “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à.
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 achoose($times) ottieni un array di risultati.
Passarlo come callable
L’istanzaLottery 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 classeLottery, 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.Utilizzo nei test
Per testare codice che dipende dalla casualità usa le API di test fornite daLottery.
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.
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, usaLottery 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().