Download the PHP package andydefer/laravel-task without Composer
On this page you can find all versions of the php package andydefer/laravel-task. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download andydefer/laravel-task
More information about andydefer/laravel-task
Files in andydefer/laravel-task
Package laravel-task
Short Description A lightweight, file-based task system for Laravel with async execution, recurring tasks, and JSONL storage
License MIT
Informations about the package laravel-task
Laravel Task
Un moteur de tâches persistantes pour Laravel. Planification dynamique, exécution récurrente, état, retry, pause, reprise - avec un simple cron.
Table des matières
- Installation
- Pourquoi Laravel Task ?
- Architecture et concepts clés
- Créer une tâche unique
- Créer une tâche récurrente
- Le noyau de directives (DirectiveKernel)
- Exécuter les tâches
- Surveillance continue
- Exécution parallèle
- Gestion des tâches
- Directive
tasks:list— Lister les tâches - Directive
tasks:search— Rechercher une tâche par alias - Circuit Breaker — Protéger les appels critiques
- Mode test et fixtures
- Cas d'usage concrets
- Intégration avec les cron jobs
- Bonnes pratiques
Installation
Prérequis : PHP 8.2+ | Laravel 12.x, 13.x, 14.x ou 15.x
Pourquoi Laravel Task ?
Le problème : Vous devez envoyer un email 30 minutes après chaque inscription. Avec Laravel Queue, il vous faut un worker permanent, Supervisor, et généralement un VPS. Sur un hébergement mutualisé, c'est impossible.
La solution : Laravel Task. Des tâches persistantes avec un cycle de vie complet, qui fonctionnent avec un simple cron.
Comparatif rapide
| Besoin | Scheduler | Queue | Laravel Task |
|---|---|---|---|
| Tâche "dans 5 minutes" | ❌ | ✅ | ✅ |
| Tâche récurrente avec date de fin | ❌ | ❌ | ✅ |
| Pause / Reprise | ❌ | ❌ | ✅ |
| Retry automatique | ❌ | ✅ | ✅ |
| État et historique | ❌ | ❌ | ✅ |
| Exécution parallèle | ❌ | ✅ | ✅ |
| Fonctionne sur hébergement SHARED | ✅ | ❌ | ✅ |
| Circuit breaker intégré | ❌ | ❌ | ✅ |
Architecture et concepts clés
Le noyau (DirectiveKernel)
Le package repose sur un noyau de directives (DirectiveKernel) qui orchestre toute l'exécution. Il agit comme un micro-framework de commandes intégré à Laravel.
Fonctionnalités clés :
- ✅ Découverte automatique des directives
- ✅ Indexation BK-Tree pour les suggestions de commandes
- ✅ Contexte partagé entre les directives
- ✅ Journalisation des exécutions en JSONL
- ✅ Mode verbose pour le débogage
- ✅ Détection de circularité
- ✅ Arguments variadiques pour filtrer par FQCN
Les directives
Le package fournit cinq directives principales :
| Directive | Description | Utilisation |
|---|---|---|
tasks:process |
Exécution unique en lot | ./bin/task tasks:process |
tasks:watch |
Surveillance continue | ./bin/task tasks:watch |
tasks:list |
Liste les tâches persistées | ./bin/task tasks:list |
tasks:search |
Recherche par alias | ./bin/task tasks:search |
fixture:register-tasks |
Création de tâches de test | ./bin/task fixture:register-tasks |
Filtrage par FQCN (Arguments variadiques)
Les directives tasks:process et tasks:watch supportent les arguments variadiques pour filtrer les tâches par leur FQCN (Fully Qualified Class Name).
Utilisation des points (.) au lieu des backslashes () :
Dans le code :
Les services de tâches
Le package expose deux services principaux qui utilisent des records pour la configuration :
Créer une tâche unique
1. Créer la classe
2. Enregistrer la tâche via le service
Créer une tâche récurrente
1. Créer la classe
2. Enregistrer la tâche
Le noyau de directives (DirectiveKernel)
Le DirectiveKernel est le cœur de l'exécution. Il permet de :
1. Exécuter une directive programmatiquement
2. Utiliser le contexte partagé
Exécuter les tâches
Une seule fois (tasks:process)
Surveillance continue (tasks:watch)
La directive tasks:watch exécute tasks:process en boucle avec un intervalle configurable.
Arguments
| Argument | Description | Défaut |
|---|---|---|
interval |
Intervalle entre les cycles (minimum 2s) | 60 |
duration |
Durée totale d'exécution en secondes | Illimité |
limit |
Nombre max de tâches par cycle | 100 |
parallel |
Nombre de workers parallèles | 1 |
fqcnNames* |
Liste des FQCN à filtrer (variadique) | Aucun |
Astuce : Utilisez _ (underscore) pour ignorer un argument positionnel et utiliser sa valeur par défaut.
Exécution parallèle
Le package supporte l'exécution parallèle des tâches via l'option --parallel.
Architecture
Gestion des tâches
États des tâches uniques
États des tâches récurrentes
API de gestion
Directive tasks:list — Lister les tâches
La directive tasks:list affiche les tâches uniques et récurrentes persistées dans un tableau, avec filtres par type, statut et FQCN.
Signature
| Argument | Type | Défaut | Description |
|---|---|---|---|
limit |
int |
50 |
Nombre maximum de tâches par statut |
fqcns |
array<string> |
[] |
Filtre par FQCN (notation pointée) |
kinds |
array<string> |
[unique,recurring] |
Types à afficher |
unique_statuses |
array<string> |
Tous | Statuts de tâches uniques |
recurring_statuses |
array<string> |
Tous | Statuts de tâches récurrentes |
Alias
tasks:lst:ls
Ordre des arguments positionnels
Les variadics sont positionnels. Pour ignorer un variadic, passer [].
| Position | Argument |
|---|---|
| 1 | limit |
| 2 | fqcns |
| 3 | kinds |
| 4 | unique_statuses |
| 5 | recurring_statuses |
Utilisation
Colonnes de sortie
| Colonne | Source unique | Source récurrente |
|---|---|---|
Kind |
unique |
recurring |
Alias |
alias |
alias |
FQCN |
fqcn |
fqcn |
Status |
status |
status |
Next / Last run |
scheduled_at |
last_run_at sinon start_at |
Attempts |
attempts |
failed_attempts |
Comportement
- Filtrage FQCN : en mémoire, après récupération des résultats. Chaque tâche est comparée par égalité stricte.
- Conversion FQCN :
App.Tasks.MyTask→App\Tasks\MyTask. - Limite : appliquée par statut, pas globalement.
- Aucun résultat : affiche
⚠️ No data to display.
Exemple de sortie
Directive tasks:search — Rechercher une tâche par alias
La directive tasks:search permet de retrouver une ou plusieurs tâches par leur alias. Elle cherche d'abord dans les tâches uniques, puis dans les tâches récurrentes.
Signature
| Argument | Type | Obligatoire | Description |
|---|---|---|---|
aliases |
array<string> |
✅ | Liste d'alias à rechercher |
Les alias sont fournis sous forme de variadic : [alias1, alias2, ...].
Alias
tasks:findt:find
Utilisation
Ordre de recherche
| Priorité | Service | Condition |
|---|---|---|
| 1 | UniqueTaskServiceInterface::find() |
Si retour non-null, l'alias est considéré trouvé |
| 2 | RecurringTaskServiceInterface::find() |
Consulté uniquement si le précédent retourne null |
Un alias n'est jamais recherché deux fois : la première correspondance gagne.
Comportement
| Cas | ExitCode | Sortie |
|---|---|---|
| Toutes les alias trouvées | SUCCESS |
Tableau des tâches |
| Certaines alias non trouvées | FAILURE |
Tableau + avertissements |
| Aucune alias trouvée | FAILURE |
Erreur + avertissements |
| Aucun alias fourni | (exception kernel) | At least one alias is required. |
Colonnes de sortie
| Colonne | Source unique | Source récurrente |
|---|---|---|
Kind |
unique |
recurring |
Alias |
alias |
alias |
FQCN |
fqcn |
fqcn |
Status |
status |
status |
Next / Last run |
scheduled_at |
last_run_at sinon start_at |
Attempts |
attempts |
failed_attempts |
Exemple de sortie
Points d'attention
- Pas de
_— chaque alias est une valeur réelle dans le variadic. - Recherche séquentielle : unique d'abord, puis recurring.
- Signale les alias introuvables un par un, sans interrompre le traitement.
Circuit Breaker — Protéger les appels critiques
Le package embarque un circuit breaker prêt à l'emploi, basé sur le cache Laravel. Il protège n'importe quelle opération dont l'échec répété est coûteux : appel HTTP, accès base de données, lecture de fichier partagé, requête sur un service interne.
Principe
- CLOSED : fonctionnement normal. Les échecs sont comptés.
- OPEN : toute exécution est refusée par
CircuitOpenException. - HALF_OPEN : après
openSeconds, quelques essais sont autorisés.successThresholdsuccès consécutifs referment le circuit.
Utilisation dans une tâche
Ajoute le trait WithCircuitBreaker à ta tâche :
Opt-in : les tâches qui n'utilisent pas le trait ne sont pas affectées. Aucune signature, aucun constructeur, aucun contrat d'interface n'est modifié.
Utilisation directe
Choix de la clé
La clé identifie la ressource protégée, pas la tâche. Deux appels avec la même clé partagent le même breaker.
| Clé suggérée | Ressource protégée |
|---|---|
firebase.fcm |
API Firebase Cloud Messaging |
webpush.mozilla |
Service Push de Mozilla |
db.replica-eu |
Réplique DB Europe |
storage.s3 |
Bucket S3 |
webhook.partner-x |
Webhook partenaire X |
mail.smtp |
Serveur SMTP |
Gestion des erreurs
Comportement en cas d'échec
- Toute exception levée par le callback est propagée après incrément du compteur d'échecs.
- L'exception d'origine n'est jamais remplacée par une exception du breaker.
- Le compteur d'échecs est réinitialisé à chaque succès en état
CLOSED.
API
| Méthode | Description |
|---|---|
CircuitBreaker::create(...) |
Construit un breaker (seuils clampés à ≥ 1) |
execute(callable $callback) |
Exécute protégé par le breaker |
state(): CircuitBreakerState |
État courant (CLOSED, OPEN, HALF_OPEN) |
recordSuccess() |
Enregistre un succès manuellement |
recordFailure() |
Enregistre un échec manuellement |
reset() |
Force l'état à CLOSED et efface les compteurs |
Configuration
Aucune configuration obligatoire. Le breaker utilise le store de cache par défaut. Pour cibler un store spécifique :
Points d'attention
- Backend de cache :
redisetdatabaseoffrent des incréments atomiques.arrayest local au processus. - Concurrence : deux workers peuvent incrémenter simultanément ; le seuil peut être franchi avec une tolérance de quelques unités.
- Aucun verrou : le breaker est conçu pour être tolérant aux races bénignes.
- Clés de cache : préfixées par
task:circuit:pour éviter les collisions.
Cas d'usage concrets
1. SaaS - Abonnements et facturation
2. E-commerce - Paniers abandonnés
3. Intégrations API - Webhooks avec retry et circuit breaker
4. Maintenance - Nettoyage et backups
5. Workflow - Orchestration en plusieurs étapes
6. Campaigns marketing - Newsletters temporaires
Intégration avec les cron jobs
Configuration de base
Bonnes pratiques
✅ Injection de services
✅ Utiliser des Value Objects pour les dates
✅ Structure des payloads avec StrictDataObject
✅ Utiliser des limites
✅ Protéger les appels critiques avec un circuit breaker
Une clé = une ressource protégée. Ne pas mélanger plusieurs ressources sous la même clé. Ne pas réutiliser la même clé entre deux services distincts.
Licence
MIT © Andy Defer
All versions of laravel-task with dependencies
laravel/framework Version ^12.0|^13.0|^14.0|^15.0
ramsey/uuid Version ^4.7
andydefer/laravel-logger Version ^3.10.1
andydefer/laravel-repository Version ^2.17.37
andydefer/laravel-directive Version ^3.67.18
zaber-dev/laravel-lock Version ^1.0