# Workers y tareas programadas

> Procesos que corren siempre, como una cola de trabajos, y comandos que se ejecutan con un horario, como el programador de Laravel. Usan el código y las variables de una app ya publicada.

Muchas apps necesitan algo más que atender visitas: procesar una cola de correos, generar informes por la noche o limpiar datos cada hora. En Dilohost eso se hace con dos tipos de proceso que salen del código de una app ya publicada.

| Tipo | Qué es | Ejemplo |
|---|---|---|
| **Worker** | Un proceso que corre siempre y se reinicia si se cae. | `php artisan queue:work`, `node worker.js`, `celery -A app worker` |
| **Tarea programada** | Un comando que se ejecuta con un horario. | `php artisan schedule:run` cada 5 minutos, un informe a las 3:00 |

No hace falta supervisor, cron ni nada parecido dentro de tu app: Dilohost se ocupa de arrancarlos.

## Antes de empezar

- La app de la que salen tiene que estar **publicada** (y no suspendida).
- Cada worker y cada tarea cuenta como un recurso más en el límite de apps de tu plan. En el plan Gratis, que admite una sola app con servidor, no queda sitio para workers ni tareas. Ver [Planes y precios](/docs/cuenta/planes).

## Añadir un worker

<p class="prompt">Añade un worker a la tienda que ejecute «php artisan queue:work» con el código de la app web.</p>

El agente usa `jobs.add_worker` con un nombre para el worker (1-20 minúsculas y números), la app de la que sale y el comando. El worker:

- usa la **misma versión** del código y las **mismas variables** que su app, y se actualiza solo cuando publicas una versión nueva;
- se reinicia si el proceso termina o falla.

## Añadir una tarea programada

<p class="prompt">Programa «php artisan schedule:run» cada 5 minutos en la tienda.</p>

El agente usa `jobs.add_cron` con el comando y el horario en **formato cron de 5 campos**, en **hora de Madrid**:

| Horario | Cuándo |
|---|---|
| `*/5 * * * *` | Cada 5 minutos |
| `0 * * * *` | Cada hora, en punto |
| `30 3 * * *` | Todos los días a las 3:30 |
| `0 9 * * 1` | Los lunes a las 9:00 |
| `0 0 1 * *` | El día 1 de cada mes a medianoche |

Reglas:

- **Como mínimo cada 5 minutos.** Un horario más frecuente se rechaza.
- Solo números, `*`, rangos (`1-5`), listas (`1,15`) y pasos (`*/10`).
- Si una ejecución sigue en marcha cuando toca la siguiente, la siguiente **no** empieza: nunca se solapan.
- Cada ejecución puede durar **como mucho una hora**. Si falla, no se reintenta: vuelve a ejecutarse en la siguiente hora prevista por su horario.

> [!TIP]
> En Laravel basta con una tarea: `php artisan schedule:run` cada 5 minutos, y los horarios los sigues definiendo en tu código. Como `schedule:run` solo ejecuta lo que toca en el minuto en que se lanza, programa tus tareas en minutos múltiplos de 5 (`everyFiveMinutes()`, `hourly()`, `dailyAt('03:30')`…): una a las 3:07 no se ejecutaría nunca.

## Ver y quitar

<p class="prompt">¿Qué workers y tareas tiene la tienda?</p>

`jobs.list` enseña cada uno con su tipo, la app de la que sale, el comando y el horario.

<p class="prompt">Quita la tarea de informes de la tienda.</p>

`jobs.remove` pide confirmación y deja de ejecutarlo. La app de la que sale no se toca.

## Ver lo que hacen

La salida de un worker o de una tarea se lee igual que la de una app:

<p class="prompt">Enséñame los últimos registros del worker «cola» de la tienda.</p>

El agente usa `app.logs` con el nombre del worker o de la tarea. Ver [Diagnóstico](/docs/publicar/diagnostico).

## Relacionado

- [Apps con servidor](/docs/publicar/apps)
- [Variables y secretos](/docs/publicar/variables)
- [Diagnóstico](/docs/publicar/diagnostico)
