Laravel queue workers op shared hosting: altijd actief via cron
Laravel queue workers op shared hosting: altijd actief via cron
Gebruik je Laravel queues voor e-mail, imports of andere achtergrondtaken? Dan heb je een queue worker nodig die de jobs verwerkt. Op een VPS gebruik je daar meestal Supervisor voor. Supervisor is op onze shared hosting niet beschikbaar, maar je hebt het ook niet nodig. Met een cronjob en flock houd je een worker continu actief, en hij start na een herstart of storing vanzelf weer op.
Hoe het werkt
Cron probeert de worker elke minuut te starten. flock zorgt ervoor dat er nooit meer dan één exemplaar tegelijk draait:
- Draait de worker al, dan stopt de nieuwe poging meteen.
- Is de worker gestopt, bijvoorbeeld na een herstart van de server, een crash of een deploy, dan start cron hem binnen een minuut opnieuw.
- Met
--max-timestopt de worker na een vaste tijd netjes. Zo blijft het geheugengebruik laag en draait hij altijd met je nieuwste code.
Je krijgt daarmee hetzelfde resultaat als met Supervisor, zonder extra software.
Wat heb je nodig?
- Een hostingpakket met SSH en cronjobs, zoals Webhosting Starter of hoger.
- Een Laravel-project dat al draait. Zie Laravel installeren op shared hosting.
Stap 1: kies de database als queue
Zet in je .env:
QUEUE_CONNECTION=database
Sinds Laravel 11 zit de jobs-tabel standaard in een nieuw project. Heb je een ouder project zonder die tabel, maak hem dan aan via SSH:
php artisan make:queue-table
php artisan migrate
Tip: Redis is bij ons bedoeld als cache. Na een herstart kunnen recente gegevens weg zijn. Kies daarom de database voor jobs die niet verloren mogen gaan, zoals e-mail.
Stap 2: maak een map voor de lock-bestanden
Log in via SSH en voer uit:
mkdir -p ~/locks
Stap 3: maak de cronjob aan
Ga in DirectAdmin naar Cronjobs (zie Cronjobs instellen in DirectAdmin). Vul bij minuut, uur, dag, maand en weekdag overal een * in, zodat de cronjob elke minuut draait. Gebruik dit als commando:
/usr/bin/flock -n /home/GEBRUIKER/locks/worker1.lock /usr/local/bin/php /home/GEBRUIKER/PAD-NAAR-PROJECT/artisan queue:work --max-time=3600 --sleep=3 --tries=3 > /dev/null 2>&1
Vervang GEBRUIKER door je DirectAdmin-gebruikersnaam en PAD-NAAR-PROJECT door de map van je Laravel-project, bijvoorbeeld domains/jouwdomein.nl/laravel.
Wat de onderdelen doen:
flock -n ...worker1.lock: start de worker alleen als er nog geen draait./usr/local/bin/php: gebruikt de PHP-versie die je in DirectAdmin bij Select PHP version hebt gekozen.--max-time=3600: de worker stopt na een uur netjes en cron start meteen een nieuwe.--sleep=3: als de queue leeg is, kijkt de worker elke 3 seconden of er nieuwe jobs zijn.--tries=3: een job die mislukt, wordt maximaal 3 keer geprobeerd en komt daarna in de tabelfailed_jobs.
Stap 4: de scheduler (als je die gebruikt)
Gebruik je de Laravel scheduler, zet dan een tweede cronjob die elke minuut draait:
/usr/local/bin/php /home/GEBRUIKER/PAD-NAAR-PROJECT/artisan schedule:run > /dev/null 2>&1
Start de queue worker niet ook nog vanuit de scheduler. De cronjob uit stap 3 regelt dat al.
Meer dan één worker
Heb je meer verwerkingscapaciteit nodig, voeg dan een tweede cronjob toe met een eigen lock-bestand:
/usr/bin/flock -n /home/GEBRUIKER/locks/worker2.lock /usr/local/bin/php /home/GEBRUIKER/PAD-NAAR-PROJECT/artisan queue:work --max-time=3600 --sleep=3 --tries=3 > /dev/null 2>&1
Elke worker heeft een eigen lock-bestand nodig. Met dezelfde lock draait er steeds maar één. Wil je een worker per queue, bijvoorbeeld voor e-mail, voeg dan --queue=mail toe.
Na een deploy
Workers houden je code in het geheugen. Voer na het uploaden van nieuwe code uit:
php artisan queue:restart
De workers maken hun huidige job af en stoppen. Binnen een minuut start cron ze opnieuw met de nieuwe code.
Controleren of de worker draait
ps -u $USER -o pid,etime,cmd | grep "queue:work" | grep -v grep
Zie je een regel met artisan queue:work, dan draait de worker. Mislukte jobs bekijk je met:
php artisan queue:failed
Goed om te weten
- Een worker gebruikt meestal zo'n 50 tot 100 MB geheugen. Dat telt mee binnen de limieten van je hostingpakket.
- Start een worker niet met
nohupof&. Zo'n worker komt na een herstart niet terug, en zonderflockstart je er makkelijk per ongeluk meerdere. - Weinig jobs? Dan kan het ook zonder permanente worker: laat cron elke minuut
queue:work --stop-when-emptyuitvoeren, ook metflock. De worker verwerkt dan wat er klaarstaat en stopt. - Draai je een testomgeving en een productieomgeving in aparte hostingpakketten, dan heeft elk pakket zijn eigen cronjobs, workers en database.
Hulp nodig?
Kom je er niet uit? Stuur ons een bericht via het ticketsysteem, dan kijken we met je mee.
Op zoek naar hosting voor je Laravel-app? Bekijk Laravel hosting.
0 van 0 vonden dit nuttig