Aller au contenu principal

Génération par cycles pour les grands catalogues

Le mode cycle divise votre catalogue de produits en lots de taille fixe afin que la génération du flux se termine de manière fiable, même sur un hébergement mutualisé avec des limites de temps PHP strictes.

remarque

Disponible depuis la v2.0.0

Vue d'ensemble

Sans le mode cycle, la génération d'un flux nécessite de traiter chaque produit dans une seule requête PHP ininterrompue. Sur les boutiques comptant des milliers de produits — ou sur un hébergement mutualisé où le serveur interrompt les requêtes après 30 à 60 secondes — cela produit un flux incomplet ou vide.

Le mode cycle résout ce problème en traitant un nombre configurable de produits par requête, en sauvegardant la progression après chaque lot, et en enchaînant automatiquement les requêtes jusqu'à ce que l'intégralité du catalogue soit écrite. Le fichier de flux que Facebook lit est toujours un instantané complet et valide issu de la dernière génération complète réussie ; il n'est jamais remplacé par un fichier partiel.

Deux zones du module contrôlent le comportement du cycle :

  • L'onglet Product Options — le champ Cycle Items (FPF_CYCLE) active ou désactive le mode cycle.
  • L'onglet Generation Options — les paramètres de performance et de sécurité qui contrôlent le comportement du moteur de cycle.

Fonctionnement du mode cycle

Lorsque le mode cycle est activé, chaque requête de génération suit les étapes suivantes :

  1. Première requête — une nouvelle génération démarre. Le moteur interroge les N premiers produits (où N correspond à la taille de votre cycle), les écrit dans un fichier de flux temporaire et sauvegarde sa position dans feeds/progress.json.

  2. Continuation — une fois le premier lot écrit, le moteur effectue un appel cURL interne vers lui-même, en transmettant la position et l'état actuels sous forme de données POST. La nouvelle requête reprend exactement là où la précédente s'était arrêtée, incrémente le compteur de cycles et traite le lot suivant.

  3. Finalisation — lorsque le dernier produit est traité, le fichier temporaire est déplacé vers l'emplacement final du flux. Ce n'est qu'à ce moment que l'URL du flux en direct reflète la nouvelle génération. Facebook lit toujours un fichier complet.

  4. Fichier de progressionfeeds/progress.json est mis à jour tous les 5 produits pendant un cycle et à chaque limite de cycle. Le tableau de bord du Back Office lit ce fichier pour afficher la barre de progression en temps réel et les compteurs de produits. Le fichier contient meta.total_feeds, meta.completed_feeds et meta.global_percent afin que l'interface puisse afficher un pourcentage précis sans charger l'intégralité du flux.

  5. Récupération après incident — si une requête est interrompue (timeout serveur, erreur mémoire, fermeture du navigateur), le prochain appel cron planifié vérifie si progress.json est plus récent que 120 secondes. Si c'est le cas, une génération est déjà en cours et le nouvel appel se termine proprement. Si plus de 120 secondes se sont écoulées depuis la dernière mise à jour de la progression, le moteur considère que l'exécution précédente a échoué et démarre une nouvelle génération depuis le début.

La garde de 120 secondes est codée en dur. Sur des serveurs très lents ou avec des tailles de cycle très grandes, vous pouvez éviter les redémarrages intempestifs en maintenant une taille de cycle suffisamment petite pour que chaque lot se termine en moins de 120 secondes.

Onglet Product Options affichant le champ Cycle Items

Onglet Generation Options affichant les champs chunk size, save cycle et cycle limit

Configuration

Activer le mode cycle

Accédez à Modules > Module Manager > Facebook & Instagram Product Catalogue Feed Pro > Configure, puis ouvrez l'onglet Product Options.

ChampEmplacementValeursDéfautDescription
Cycle Items (FPF_CYCLE)Product OptionsTout entier positif, ou 0 pour désactiver0 (désactivé)Nombre de produits à traiter par cycle. Définissez 0 pour générer l'intégralité du catalogue en une seule requête. Recommandé : 500 à 2 000 selon la complexité du catalogue.

Lorsque Cycle Items est à 0, le moteur tente de générer tous les produits en une seule requête. Cela fonctionne parfaitement sur un VPS ou un serveur dédié sans limites de temps, mais risque d'expirer sur un hébergement mutualisé avec des catalogues dépassant ~1 000 produits.

Paramètres de performance et de sécurité

Ouvrez l'onglet Generation Options pour accéder aux champs suivants.

ChampValeursDéfautMinimumDescription
Product processing chunks (FPF_CHUNK_SIZE)Entier positif2000Les produits sont chargés depuis la base de données par lots de cette taille. Ce paramètre contrôle la taille des requêtes SQL, et non le nombre de produits par cycle. Réduisez cette valeur si vous rencontrez des erreurs mémoire lors de l'étape de chargement des stocks.
Product Save cycle (FPF_FEED_UPDATE)Entier ≥ 555Fréquence (en nombre de produits traités) à laquelle le fichier de flux temporaire est vidé sur le disque. Des valeurs faibles réduisent la perte de données en cas d'incident, mais augmentent les opérations I/O. Les valeurs inférieures à 5 sont silencieusement ramenées à 5.
Product Overrides save cycle (FPF_FEED_UPDATE_OVERRIDES)Entier ≥ 101010Identique au précédent, mais pour les flux de remplacement par langue et par pays. Les valeurs inférieures à 10 sont silencieusement ramenées à 10.
Maximum number of Cycles (FPF_FEED_UPDATE_CYCLES)Entier ≥ 505050Limite supérieure stricte du nombre de cycles qu'une génération complète peut utiliser avant que le moteur s'arrête. Il s'agit d'une protection contre les boucles infinies. Les valeurs inférieures à 50 sont silencieusement ramenées à 50.
Ignore Abort (FPF_IGNORE_ABORT)Activé / DésactivéDésactivéLorsqu'il est activé, appelle ignore_user_abort(true) pour que le processus PHP continue à s'exécuter même si la connexion navigateur est interrompue. Utile pour la génération manuelle via la console.

Les planchers minimaux pour FPF_FEED_UPDATE_OVERRIDES (10) et FPF_FEED_UPDATE_CYCLES (50) sont appliqués silencieusement à la sauvegarde. Si vous saisissez un nombre inférieur, il est remplacé sans message d'avertissement.

Limite de cycles atteinte : si votre catalogue nécessite plus de cycles que la valeur de Maximum number of Cycles, la génération s'arrête prématurément et le flux peut être incomplet. Multipliez le nombre de produits par 1,2 (pour tenir compte des flux par langue et par pays) puis divisez par la taille de votre cycle pour estimer le nombre de cycles nécessaires. Définissez le maximum au moins 20 % au-dessus de cette estimation.

Combinaison avec le cron

Le mode cycle et le cron sont conçus pour fonctionner ensemble. La configuration recommandée est la suivante :

  1. Définissez Cycle Items sur une valeur qui s'inscrit confortablement dans la limite de temps d'exécution PHP de votre serveur — en règle générale, 500 produits prennent entre 10 et 30 secondes selon la vitesse du serveur, la complexité du catalogue et l'activation de la livraison.
  2. Ajoutez une tâche cron qui appelle l'URL de génération du flux toutes les 15 à 30 minutes. L'URL cron est indiquée dans l'onglet Automatic Generation (Cron Jobs).
  3. Le premier appel cron démarre la génération. Si le catalogue nécessite plusieurs cycles, le moteur les enchaîne automatiquement au sein du même appel cron en utilisant des appels cURL internes. Le cron n'a pas besoin de se déclencher une fois par cycle.

Si la génération complète de votre flux dure plus longtemps que l'intervalle cron, deux mécanismes vous protègent : la garde de progression de 120 secondes empêche un second appel cron de relancer une génération en cours, et l'URL du flux en direct n'est mise à jour qu'à la fin d'une génération — Facebook lit donc toujours la dernière version complète.

Pour les très grands catalogues (50 000 produits et plus) ou les serveurs où cURL est restreint, envisagez de lancer la génération en ligne de commande :

php index.php --fpf_secret_key=YOUR_KEY

La génération en CLI désactive l'approche cycle-par-requête et exécute la génération complète dans un seul processus sans la surcharge de l'enchaînement cURL.

Comportement face aux limites de temps

Au début de chaque cycle, le module tente d'augmenter le max_execution_time de PHP. La limite de temps cible est calculée à partir de la taille du cycle : taille_cycle / 5 secondes lorsque les déclinaisons sont activées, taille_cycle / 10 secondes dans le cas contraire. Par exemple, avec 2 000 produits et les déclinaisons activées, il demande 400 secondes par cycle.

Si set_time_limit est désactivé sur votre serveur (fréquent sur l'hébergement mutualisé), cet ajustement est silencieusement ignoré et la limite existante s'applique. Maintenez une taille de cycle suffisamment petite pour que chaque lot se termine dans cette limite.

Le module tente également d'augmenter la limite mémoire PHP à 1 Go au début de la génération si moins de 1 Go est actuellement alloué et si la mémoire système libre disponible est suffisante.

Exemples d'utilisation

Exemple : Hébergement mutualisé avec limite de 120 secondes

Une boutique avec 8 000 produits sur hébergement mutualisé. Chaque produit prend environ 15 ms à traiter (sans déclinaisons, sans livraison). Cela donne environ 2 000 produits en 30 secondes.

Paramètres recommandés :

  • Cycle Items : 1 500 (laisse une marge de sécurité en dessous de la limite de 120 s)
  • Maximum number of Cycles : 100 (8 000 / 1 500 = ~6 cycles pour le flux principal, plus les flux par langue et par pays)
  • Intervalle cron : toutes les 15 minutes

Chaque appel cron enchaîne ~6 cycles automatiques et complète la génération intégrale en une seule exécution.

Exemple : Boutique de vêtements avec déclinaisons

Une boutique avec 3 000 produits, chacun ayant 10 à 15 déclinaisons de taille et de couleur. Le traitement des déclinaisons prend environ 3 à 5 fois plus de temps par produit.

Paramètres recommandés :

  • Cycle Items : 500
  • Maximum number of Cycles : 100
  • Product processing chunks (FPF_CHUNK_SIZE) : 500 (correspond à la taille du cycle pour éviter de charger plus en mémoire que ce qui est traité)

Exemple : VPS sans limite de temps

Une boutique avec 15 000 produits sur un VPS où max_execution_time est à 0 ou très élevé.

Paramètres recommandés :

  • Cycle Items : 0 (désactivé — génération en passe unique)
  • Intervalle cron : toutes les 60 minutes

Désactiver les cycles supprime la surcharge de l'enchaînement cURL et simplifie le débogage.

Remarques importantes

  • Le mode cycle est par boutique dans les configurations multi-boutiques, mais le champ Cycle Items lui-même est stocké comme valeur de configuration globale et s'applique à toutes les boutiques d'une installation multi-boutiques.
  • Les flux de remplacement par langue et par pays sont générés après la fin du flux principal. Ils bénéficient également du mode cycle, mais utilisent une fréquence de sauvegarde distincte contrôlée par FPF_FEED_UPDATE_OVERRIDES.
  • Le fichier feeds/progress.json est écrit dans le dossier feeds/ du module. Assurez-vous que l'utilisateur du serveur web dispose des droits d'écriture sur ce dossier.
  • Le flux est servi depuis un fichier temporaire pendant la génération et déplacé vers l'emplacement final uniquement à la fin. Si vous consultez l'URL du flux en cours de génération, vous recevez la version complète précédente.
  • Lors d'une exécution en CLI (php_sapi_name() === 'cli'), la valeur FPF_CYCLE n'est pas chargée — la génération en CLI s'exécute toujours en mode passe unique, quelle que soit la valeur de Cycle Items.

Résolution des problèmes

ProblèmeSolution
Le flux est toujours vide ou partielLa taille du cycle est trop grande pour la limite de temps de votre serveur. Réduisez Cycle Items à 500 ou moins et régénérez.
Le message « A Feed generation is currently in progress » s'affiche à chaque déclenchementUne génération précédente a échoué. Attendez 120 secondes et réessayez. Si le problème persiste, vérifiez que le dossier feeds/ est accessible en écriture afin que progress.json puisse être mis à jour.
La barre de progression du tableau de bord reste bloquée à un pourcentageLe processus de génération a été interrompu en plein cycle. La barre reflète le dernier progress.json écrit. Déclenchez une nouvelle génération pour repartir.
Limite de cycles atteinte, flux incompletAugmentez Maximum number of Cycles dans l'onglet Generation Options. Estimez les cycles nécessaires ainsi : (nombre total de produits × nombre de flux) ÷ taille du cycle.
Erreurs mémoire pendant la générationRéduisez Product processing chunks (FPF_CHUNK_SIZE) pour diminuer le nombre de produits chargés en mémoire simultanément lors de l'étape de chargement des stocks.
La génération se termine mais l'URL du flux affiche toujours les anciennes donnéesLe flux n'a pas été déplacé car la génération ne s'est pas entièrement terminée. Consultez l'onglet Errors pour identifier les erreurs produit qui ont pu provoquer un arrêt prématuré.
La génération en CLI ignore le paramètre Cycle ItemsC'est le comportement attendu. En CLI, la génération s'exécute en passe unique ; le mode cycle s'applique uniquement aux requêtes web et cron.

Foire aux questions

Comment savoir si ma boutique a besoin du mode cycle ?

Si votre boutique compte plus de 1 000 produits, ou si vous avez déjà constaté un flux vide ou incomplet, vous devriez activer le mode cycle. Commencez avec une taille de cycle de 1 000 et réduisez-la si la génération s'interrompt encore.

Le mode cycle ralentit-il la génération globale du flux ?

Légèrement. Chaque cycle ajoute une petite surcharge liée à l'appel cURL et aux opérations I/O sur le fichier de progression. Pour la plupart des boutiques, le temps total de génération augmente de 5 à 10 % par rapport à la passe unique. La contrepartie est une fiabilité accrue sur les serveurs à limites de temps.

Que se passe-t-il pour le flux en direct pendant la génération ?

Rien ne change. L'URL du flux en direct sert le dernier flux complètement généré jusqu'à ce que la nouvelle génération se termine et déplace le fichier temporaire en place. Vos clients et Facebook ne subissent aucune interruption.

J'ai défini Maximum number of Cycles à 30 et sauvegardé, mais le formulaire affiche 50. Est-ce un bug ?

Non. La valeur minimale autorisée pour ce champ est 50. Si vous saisissez un nombre inférieur à 50, il est automatiquement ramené à 50 à la sauvegarde. Il en va de même pour Product Overrides save cycle (minimum 10) et Product Save cycle (minimum 5).

Puis-je lancer la génération en ligne de commande plutôt que via le cron ?

Oui. Utilisez php index.php --fpf_secret_key=YOUR_KEY depuis la racine de PrestaShop. La génération en CLI s'exécute toujours en passe unique (le mode cycle est désactivé en CLI). Cela est utile pour les très grands catalogues sur des serveurs où le PHP CLI n'a pas de limite de temps.

Dans une configuration multi-boutiques, chaque boutique génère-t-elle son flux indépendamment ?

Une seule exécution de génération traite toutes les boutiques activées en séquence au sein de la même chaîne de cycles. Les boutiques déjà traitées sont automatiquement ignorées dans les cycles de continuation afin qu'aucun travail ne soit dupliqué.

La barre de progression du tableau de bord affiche 100 % mais l'URL du flux retourne d'anciens produits. Que s'est-il passé ?

Cela peut se produire si le dossier feeds/ n'est pas accessible en écriture, ce qui empêche le fichier temporaire d'être déplacé vers l'emplacement final. Vérifiez que l'utilisateur du serveur web dispose des droits d'écriture sur /modules/facebookproductsfeed/feeds/.

Fonctionnalités associées