web-dev-qa-db-fra.com

Problèmes de ressources: Importation de données externes dans un type de publication personnalisé et mise à jour des enregistrements

J'ai un type de message personnalisé qui importe des données externes tous les soirs. Lorsque le script d'importation est exécuté pour la première fois, il importe environ 4 000 enregistrements (les données augmenteront). Chaque enregistrement comprend un titre de publication, un corps et 15 méta-champs supplémentaires.

Une fois que l'importation a été exécutée au moins une fois, toutes les nuits suivantes, elle met à jour au moins un champ méta de chaque enregistrement pour indiquer que l'enregistrement existait dans le jeu de données externe et qu'il était à jour.

Les données externes contiennent un champ de date modifié qui indique quand un enregistrement a été modifié en dehors de WordPress. Si le script d'importation détecte qu'un enregistrement a changé, il mettra à jour tous les champs.

À la toute fin de l'importation, un script interne examinera tous les enregistrements et recherchera ceux qui n'ont pas été mis à jour. Si un enregistrement n'a pas été mis à jour, un indicateur de suppression est défini et le statut publié est modifié. Finalement, cet enregistrement est supprimé.

Enfin, chaque enregistrement peut être écrasé dans WordPress, ce qui définit un indicateur indiquant que cette publication ne doit pas être mise à jour lors d'une importation. C'est l'une des raisons pour lesquelles nous avons décidé de les placer dans un type d'article personnalisé, car cela permet de contrôler les données avant que l'enregistrement ne soit affiché sur le site.

J'utilise wp_insert_post pour insérer et mettre à jour des enregistrements, update_post_meta pour insérer et mettre à jour des champs méta, un WP_Query pour obtenir tous les enregistrements actuels et expirés et, éventuellement, je supprime les enregistrements devant être supprimés avec wp_delete_post et delete_post_meta.

Le problème est que ce script nécessite trop de ressources pour être exécuté et que WordPress finira par expirer et ne pas terminer le script.

Je suppose que j'ai deux options:

  1. Je décompose ce script en lots. Par exemple, je pourrais traiter 1 000 enregistrements à la fois et stocker un index afin qu’il sache où récupérer les informations lors de la deuxième itération.
  2. Je pourrais essayer d'utiliser différentes fonctions. Par exemple, lors de l'importation initiale, j'exécute update_post_meta une fois par champ (15x). Je pourrais probablement trouver un moyen de faire cette requête via une requête personnalisée.

Ma question est de savoir si quelqu'un a déjà rencontré des problèmes de ressources dans WordPress lors de la synchronisation de données avec une source externe et comment ils ont réussi à les résoudre. Était-ce via l'option n ° 1, n ° 2 ou peut-être une méthode totalement différente?

3
NightHawk

Une aide importante que j'ai trouvée lors de l'importation/mise à jour de grandes quantités de publications consiste à utiliser les tables et transactions InnoDB, par lots de 200 à 500 publications (avec plus de postmeta, utilisez des lots de publication plus petits). Cela améliore considérablement les performances, étant donné qu’il s’agit en grande partie d’instructions individuelles MySQL dont chacune doit figurer à un moment donné dans le journal des transactions de la base de données. Alors:

  • émettre une $wpdb->query('start transaction');
  • après (nombre de lots), émettez une $wpdb->query('commit'); et une autre $wpdb->query('start transaction');
  • à la fin, émettez une $wpdb->query('commit');
  • en cas d'échec/d'exception, émettez une $wpdb->query('rollback');

Après cela, examinez ensuite votre n ° 2 pour le postmeta, créez une seule instruction SQL pour insérer (ou mettre à jour) tout le postmeta d'un post à la fois, car cela fera également une grande différence une fois que vous avez des transactions.

1
webaware