Évitez les erreurs HTTP 504 (Gateway Timeout) en déportant les traitements de fichiers Excel/CSV lourds vers des workers d'arrière-plan avec Redis.
L'importation de fichiers Excel ou CSV volumineux (plus de 10 000 lignes) au sein d'une simple requête HTTP classique est une erreur fréquente qui mène inévitablement à des erreurs HTTP 504 de dépassement de délai (Gateway Timeout). Voyons comment architecturer un pipeline d'importation asynchrone et résilient avec Redis et les Files d'Attente Laravel.
1. Téléchargement : L'utilisateur soumet le fichier Excel.
2. Mise en File d'Attente : Le fichier est stocké, et un Job d'importation est poussé dans la file d'attente Redis. Le serveur renvoie immédiatement un statut HTTP 200.
3. Traitement en Arrière-Plan : Un worker récupère le Job en file, lit le fichier par morceaux (chunks) et écrit en base.
4. Notification en Temps Réel : L'utilisateur suit l'avancement de l'import via des WebSockets.
Plutôt que d'exécuter la lecture du fichier de manière synchrone, nous déléguons la tâche :
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// app/Http/Controllers/ImportController.php
namespace AppHttpControllers;
use AppJobsProcessExcelImport;
use IlluminateHttpRequest;
class ImportController extends Controller
{
public function upload(Request $request)
{
$request->validate(['file' => 'required|mimes:xlsx,csv']);
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// Enregistre le fichier temporairement
$path = $request->file('file')->store('imports');
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// Lance le Job en arrière-plan sur Redis
ProcessExcelImport::dispatch($path, auth()->user()->id);
return response()->json([
'message' => 'Upload effectué avec succès. Traitement en cours en arrière-plan.',
]);
}
}Dans le Job, nous lisons les données par paquets de 500 lignes pour éviter la saturation de la mémoire PHP et les coupures serveurs.
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// app/Jobs/ProcessExcelImport.php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use MaatwebsiteExcelFacadesExcel;
class ProcessExcelImport implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $filePath;
protected $userId;
public function __construct($filePath, $userId)
{
$this->filePath = $filePath;
$this->userId = $userId;
}
public function handle()
{
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// Importation par paquets pour préserver la mémoire
Excel::import(new InventoryImport($this->userId), $this->filePath);
}
}L'utilisation de Redis comme courtier de messages combiné à des files d'attente maintient votre application ultra-réactive et résistante face aux montées en charge.