# Laravel queue workers, scheduler en Node.js-processen

> Draai Laravel queue workers onder Supervisor, zet de scheduler aan met elke minuut schedule:run en houd een Node.js-app draaiende met Vimonto Deploy.

De pagina **Wachtrijen en scheduler** van een Laravel-site draait de processen die je app naast het beantwoorden van webrequests nodig heeft: queue workers die jobs op de achtergrond afhandelen, en de Laravel-scheduler. Voor een Next.js- of Nuxt-site heet dezelfde pagina **Processen** en houdt die je Node.js-app draaiende.

Elke worker en elk proces draait onder Supervisor op de server, die het bij het opstarten start en herstart wanneer het stopt. Vimonto Deploy herstart ze na elke deploy, zodat ze altijd je nieuwste code draaien.

![De pagina Wachtrijen en scheduler met de planner aangezet en twee draaiende queue workers](https://ops.vimonto.com/docs-media/nl/site-queues.webp?v=161e760d "Queue workers en de scheduler van een Laravel-site")

De pagina is er voor Laravel-, Statamic-, Next.js- en Nuxt-sites. Voor processen die niet bij één site horen, gebruik je de pagina's [processen](https://ops.vimonto.com/docs/nl/servers/processes) en [planner](https://ops.vimonto.com/docs/nl/servers/scheduler) van de server.

## De Laravel-scheduler aanzetten

De scheduler van Laravel draait de taken die je in je app definieert (`routes/console.php` of de console kernel). Daarvoor is één cron-regel nodig die elke minuut draait:

```text
* * * * * php8.4 artisan schedule:run
```

Klik onder **Planner** op **Aanzetten**. Vimonto Deploy voegt de cron-regel voor de site toe; die draait als de gebruiker van de site in de live release. De status verandert in **Aan** zodra hij er staat. Klik op **Uitzetten** om hem te verwijderen. De uitvoer van elke run wordt bewaard in een logboek: open de pagina [planner](https://ops.vimonto.com/docs/nl/servers/scheduler#het-logboek-lezen) van de server en klik op **Logboek** naast de taak met **Via Planner**.

De scheduler staat ook als **Planner** in het menu [sitefuncties](https://ops.vimonto.com/docs/nl/sites/site-features); beide zetten hetzelfde aan of uit.

## Een queue worker toevoegen

Een queue worker draait `php artisan queue:work` en verwerkt de jobs die je app dispatcht. Zo voeg je er een toe:

1. Klik op **Worker toevoegen**.
2. Vul de instellingen hieronder in.
3. Klik op **Toevoegen**.

| Instelling | Standaard | Wat het doet |
|---|---|---|
| **Verbinding** | `redis` (of `database` op een server zonder Redis) | De queue-verbinding uit `config/queue.php`. |
| **Wachtrij** | `default` | De wachtrijen die worden verwerkt, gescheiden door komma's, op volgorde van prioriteit, zoals `high,default`. |
| **Processen** | 1 | Hoeveel kopieën van de worker naast elkaar draaien (tot 50). |
| **Timeout (seconden)** | 60 | Hoe lang één job mag draaien voordat hij wordt gestopt (`--timeout`). |
| **Pogingen** | 3 | Hoe vaak een mislukkende job wordt geprobeerd (`--tries`). |
| **Wachten als leeg (seconden)** | 3 | Hoe lang er wordt gewacht als de wachtrij leeg is (`--sleep`). |
| **Herstarten na (seconden)** | 3600 | Na deze tijd stopt de worker en wordt hij opnieuw gestart (`--max-time`). |
| **Geheugen (MB)** | 256 | De worker herstart als hij meer geheugen gebruikt (`--memory`). |

De worker draait als de gebruiker van de site in de live release van de site, met de PHP-versie van de site:

```text
php8.4 /home/vimonto/shop.example.com/current/artisan queue:work redis --queue=default --sleep=3 --tries=3 --timeout=60 --max-time=3600 --memory=256
```

Bij een [monorepo](https://ops.vimonto.com/docs/nl/sites/create-a-site#een-monorepo-deployen) draait de worker in de hoofdmap van de site binnen de release, bijvoorbeeld `/home/vimonto/shop.example.com/current/backend/artisan` met hoofdmap `/backend`. Hetzelfde geldt voor de planner en de processen van [sitefuncties](https://ops.vimonto.com/docs/nl/sites/site-features) zoals Horizon.

Als een worker wordt gestopt, geeft Supervisor een lopende job zijn timeout plus vijf seconden om af te ronden voordat hij wordt gestopt.

> [!TIP]
> Zorg dat `QUEUE_CONNECTION` in de [.env](https://ops.vimonto.com/docs/nl/sites/environment) overeenkomt met de verbinding waarop je workers luisteren. Een nieuwe Laravel-site gebruikt `redis` op servers met Redis.

### Workers herstarten na elke deploy

Als een deploy live gaat, voert Vimonto Deploy `php artisan queue:restart` uit. Elke worker maakt zijn huidige job af en stopt, en Supervisor start hem opnieuw op de nieuwe release. Je hoeft dit niet aan je deployscript toe te voegen.

## Zien of workers draaien

Elke worker toont zijn naam, commando, aantal processen en de actuele status uit Supervisor: **Bezig**, **Start op**, **Wordt gestopt**, **Gestopt** of **Mislukt**. Klik op **Status vernieuwen** om de status opnieuw op te halen.

Voor elke draaiende worker kun je:

- **Herstarten**. Na een wijziging in de `.env` herstart de optie **Workers herstarten** bij het [opslaan](https://ops.vimonto.com/docs/nl/sites/environment#de-config-cache-vernieuwen-en-workers-herstarten-bij-opslaan) elke worker van de site voor je.
- **Stoppen**, en later weer **Starten**. Een gestopte worker blijft gestopt tot je hem start of de server herstart.
- **Log bekijken**, wat de processenpagina van de server opent met de uitvoer van de worker.
- **Verwijderen**. De processen stoppen en worden niet opnieuw gestart.

## Workers van sitefuncties

Sommige [sitefuncties](https://ops.vimonto.com/docs/nl/sites/site-features) draaien eigen processen, zoals **Horizon**, **Reverb**, **Pulse**, **Inertia SSR** en **Nightwatch**. Ze staan in de lijst met een badge **Via …**, bijvoorbeeld **Via Horizon**. Je ziet hier hun status en kunt ze herstarten, maar wijzigen of verwijderen doe je alleen via de functie in de siteheader.

> [!WARNING]
> Horizon draait alle queue workers die je `config/horizon.php` beschrijft. Zet je Horizon aan, verwijder dan de queue workers die je zelf hebt toegevoegd, zodat jobs niet twee keer worden opgepakt.

## Een Node.js-app draaien

Voor Next.js- en Nuxt-sites heet de pagina **Processen**. Nginx stuurt requests door naar de app op de poort van de site (te zien in het overzicht van de site en in te stellen onder [site-instellingen](https://ops.vimonto.com/docs/nl/sites/site-settings) als **Poort van je app**), dus je app moet draaien en op die poort luisteren.

Dat hoef je niet zelf in te stellen: bij het aanmaken van de site voegt Vimonto Deploy een proces toe dat je app start met `PORT` op de poort van de site. Het draait in de live release van de site (in de hoofdmap van een monorepo) als de gebruiker van de site.

| Framework | Proces | Commando, voor poort 3000 |
|---|---|---|
| Next.js | **Next.js-app** | `env PORT=3000 npm run start` (met je pakketbeheerder) |
| Nuxt | **Nuxt-app** | `env PORT=3000 node .output/server/index.mjs` |

Tot de eerste deploy is er nog geen code om te starten. Het proces staat dan op **Wacht**, met *Start bij de eerste deploy.* De eerste deploy zet het op de server en start het; een proces dat niet kon starten, wordt bij de volgende deploy opnieuw geprobeerd. Wijzig je de poort onder [site-instellingen](https://ops.vimonto.com/docs/nl/sites/site-settings#de-poort-van-een-nodejs-app-wijzigen), dan verhuist het proces mee naar de nieuwe poort.

Supervisor herstart de app als die crasht, en Vimonto Deploy herstart hem na elke deploy, zodat hij de nieuwe build draait.

Wil je nog iets anders draaien, of je app op je eigen manier starten? Klik op **Proces toevoegen**, typ het **Commando** (het draait in de live release van de site, in de hoofdmap van een monorepo, als de gebruiker van de site), stel het aantal **Processen** in en klik op **Toevoegen**. Vervang je het eigen proces van de app, verwijder dat dan, zodat er geen twee kopieën om dezelfde poort strijden.

## Veelgestelde vragen

### Heb ik Supervisor nodig voor Laravel-queues?

Ja, een queue worker is een langlopend proces dat opnieuw moet worden gestart als het stopt. Vimonto Deploy configureert Supervisor voor je; elke worker die je toevoegt is een Supervisor-programma op de server.

### Gebruik ik Horizon of queue workers?

Gebruik Horizon als je app Redis-queues gebruikt en je het dashboard, de statistieken en de automatische balancering wilt. Zet het aan in het menu [sitefuncties](https://ops.vimonto.com/docs/nl/sites/site-features#horizon). Gebruik gewone queue workers voor de `database`-driver of als je Horizon niet nodig hebt. Draai ze niet allebei op dezelfde wachtrijen.

### Waarom draait mijn geplande taak niet?

Controleer of de planner op **Aan** staat en of de taak in je app is gedefinieerd. Geplande taken draaien in de live release, dus een site die nog niet is gedeployed draait niets. Het **Logboek** op de pagina [planner](https://ops.vimonto.com/docs/nl/servers/scheduler#het-logboek-lezen) van de server laat zien wat `schedule:run` bij de laatste runs schreef.

### Houden workers de oude PHP-versie als ik wissel?

Ja. Workers en de scheduler houden de PHP-versie waarmee ze zijn aangemaakt. Voeg ze opnieuw toe nadat je de PHP-versie van de site hebt gewijzigd onder [site-instellingen](https://ops.vimonto.com/docs/nl/sites/site-settings).
