Performances sur les grands jeux de données
Laravel Feeds écrit progressivement les enregistrements. La mémoire reste limitée uniquement si chaque étape en amont demeure lazy.
Garder la requête lazy
Renvoyez directement un Builder Eloquent :
public function builder(): Builder
{
return Product::query()
->select(['id', 'title', 'updated_at'])
->where('is_exportable', true);
}
Ne matérialisez pas le résultat complet avant la génération. Sélectionnez uniquement les colonnes nécessaires et ne préchargez que les relations utilisées par item() afin d’éviter les requêtes N+1.
Ajuster la taille des lots
La valeur par défaut est de 1000 enregistrements. Une valeur plus basse réduit le pic de mémoire des modèles et augmente le nombre de requêtes. Une valeur plus haute réduit le coût des requêtes et augmente la mémoire. Mesurez avec des lignes proches de la production.
public function chunkSize(): int
{
return 500;
}
Fractionner les fichiers de sortie
Utilisez perFile() si les consommateurs acceptent plusieurs fichiers ou si une seule sortie devient difficile à publier et à relancer.
public function perFile(): int
{
return 50000;
}
Laissez maxFiles() à sa valeur par défaut 0 lorsque tous les enregistrements correspondants doivent être exportés. Lorsque perFile() et maxFiles() sont tous deux supérieurs à zéro, Laravel Feeds exporte au plus leur produit et termine la génération avec succès sans signaler les enregistrements suivants omis. Définissez maxFiles() uniquement si cette limite du nombre d’enregistrements est volontaire.
Mettre les flux longs en file d’attente
Le mode file d’attente déplace la génération hors de la commande, mais ne réduit pas la mémoire utilisée par un flux. Utilisez une connexion asynchrone, des workers avec des limites adaptées et un TTL d’unicité supérieur à la durée attendue.
Mesurer tout le parcours
Mesurez séparément la base de données, l’hydratation des modèles, la transformation, la sérialisation et la publication. Un disque distant peut devenir le coût principal même si la génération est rapide.