Wat is de Lottery-klasse
Illuminate\Support\Lottery is een utility-klasse waarmee je kansgebaseerde operaties in een vloeiende API kunt uitdrukken. Patronen als “voer een bewerking maar eens per 100 requests uit” of “log alleen bij een deel van de requests gedetailleerd” schrijf je er eenvoudig mee.
De implementatie staat in
src/Illuminate/Support/Lottery.php. Laravel gebruikt deze klasse ook intern in het framework, bijvoorbeeld voor de session-GC en het prunen van cachelocks.Basisgebruik
De kans opgeven als gehele verhouding
MetLottery::odds($chances, $outOf) geef je de kans op als “outOf keer”.
De kans opgeven als decimaal
Als je$outOf weglaat en een decimaal tussen 0.0 en 1.0 meegeeft, wordt die rechtstreeks als kans gebruikt.
Een boolean teruggeven zonder callbacks
Als je geen winner / loser instelt, geeftchoose() true terug bij winst en false bij verlies.
Meerdere keren uitvoeren
Geef je aanchoose($times) een aantal mee, dan krijg je een array met resultaten terug.
Doorgeven als callable
EenLottery-instantie implementeert __invoke en kun je dus rechtstreeks doorgeven aan API’s die een callable verwachten.
Praktische use cases
1. Cache prunen (maar eens per 100 keer uitvoeren)
Ideaal voor onderhoudstaken die niet bij elke aanroep hoeven te draaien, zoals het verwijderen van verlopen records.2. Telemetrie-sampling (alleen bij een deel van de requests gedetailleerd loggen)
Als het te duur is om alle requests te loggen, kun je dit voor sampling gebruiken.3. A/B-test-achtig gedrag
Verdeel gebruikers probabilistisch over twee codepaden.4. Periodieke taken willekeurig uitvoeren als aanvulling op de scheduler
Handig als je een taak willekeurig wilt uitvoeren en tegelijk dubbele uitvoering op meerdere servers wilt vermijden.Probabilistische patronen binnen het Laravel-framework
Laravel gebruikt ook intern in het framework op grote schaal probabilistische onderhoudstaken. Sommige implementaties zijn geschreven vóór deLottery-klasse bestond en gebruiken daarom rechtstreeks random_int(), maar ze zijn gebaseerd op hetzelfde idee.
1
Session: garbage collection
Illuminate\Session\Middleware\StartSession::configHitsLottery() gebruikt de lottery-instelling uit config/session.php en beslist met random_int of de GC wordt uitgevoerd.2
DatabaseLock: verlopen locks prunen
Illuminate\Cache\DatabaseLock::acquire() verwijdert bij elke lock-acquisitie volgens hetzelfde verhoudingspatroon verlopen locks.3
DB::whenQueryingForLongerThan — een Lottery-instantie doorgeven
Omdat een
Lottery-instantie als callable kan worden doorgegeven, kun je hem rechtstreeks gebruiken als callback voor slow-query-detectie.Gebruik in tests
Voor het testen van code met randomness gebruik je de test-API’s dieLottery aanbiedt.
Lottery::alwaysWin() — altijd laten winnen
Lottery::alwaysLose() — altijd laten verliezen
Lottery::fix() — resultaten fixeren met een sequentie
Je kunt de resultaten van meerdere aanroepen sturen met een array van true/false.
Lottery::setResultFactory() — een eigen factory injecteren
Als je fijnmazigere controle nodig hebt, gebruik je een eigen factory.
Toepassing in pakketontwikkeling
Registratie in de service provider
Als je onderhoudstaken inbouwt in de service provider van je pakket, gebruik jeLottery om de belasting te spreiden.
De odds uit de configuratie lezen
Door de kans configureerbaar te maken via een configuratiebestand, kunnen gebruikers hem makkelijk bijstellen.Sampling in middleware
API-referentie
Gerelateerde pagina’s
Macroable-trait
Leer het uitbreidingspatroon waarmee je nieuwe methodes toevoegt aan bestaande klassen.
Conditionable-trait
Leer hoe je voorwaardelijke chains ontwerpt met
when() / unless().