Lorsque vous travaillez avec des API pour récupérer de grandes quantités de données (potentiellement des milliers d'éléments), plusieurs aspects cruciaux doivent être pris en compte pour garantir que le processus est efficace, flexible et performant. Voici un aperçu des facteurs clés à gérer, ainsi qu'une solution pour les utilisateurs PHP.
Considérations clés lors de la récupération de données volumineuses via l'API
Permettez-moi de partager quelques considérations clés pour récupérer efficacement de grands ensembles de données via l'API :
-
Gestion de la pagination : les API fournissent généralement des données sous forme de pages. Pour récupérer toutes les données, vous devez gérer la pagination, en effectuant plusieurs appels API tout en gardant une trace du curseur ou du numéro de page. Le calcul du nombre d'appels API requis et la gestion de ce processus sont essentiels pour garantir que vous obtenez l'ensemble de données complet.
-
Gestion de la mémoire : lors de la récupération de grands ensembles de données, tout charger en mémoire en même temps peut surcharger votre système. Il est crucial d’éviter de charger tous les résultats en mémoire en même temps. Au lieu de cela, traitez les données par morceaux, en vous assurant que votre application reste réactive et ne rencontre pas de problèmes de mémoire.
-
Limitation de débit et limitation : de nombreuses API imposent des limites de débit, par exemple en vous limitant à X requêtes par seconde ou Y requêtes par minute. Pour rester dans ces limites, vous devez mettre en œuvre un mécanisme de limitation flexible qui s'adapte aux restrictions spécifiques de l'API.
-
Requêtes API parallèles : étant donné la nécessité d'effectuer de nombreux appels API en raison de la pagination, vous souhaitez récupérer les données le plus rapidement possible. Une stratégie consiste à effectuer plusieurs appels API en parallèle, tout en respectant les limites de débit. Cela garantit que vos requêtes sont à la fois rapides et conformes aux contraintes de l'API.
-
Collecte de données efficace : malgré de nombreuses requêtes API paginées, vous devez combiner les résultats en une seule collection, en les traitant efficacement pour éviter une surcharge de mémoire. Cela garantit un traitement fluide des données tout en maintenant une faible utilisation des ressources.
-
Analyse JSON optimisée : de nombreuses API renvoient des données au format JSON. Lorsque vous traitez des réponses volumineuses, il est important d'accéder et d'interroger des sections spécifiques du JSON de manière performante, en garantissant que des données inutiles ne soient pas chargées ou traitées.
-
Gestion efficace des exceptions : les API génèrent généralement des exceptions via des codes d'état HTTP, indiquant des problèmes tels que des délais d'attente, un accès non autorisé ou des erreurs de serveur. Il est important de les gérer à l’aide du mécanisme d’exception fourni par votre langage de programmation. Au-delà de la gestion de base des erreurs, vous devez également mapper et déclencher des exceptions d'une manière qui s'aligne sur la logique de votre application, rendant le processus de gestion des erreurs clair et gérable. La mise en œuvre de nouvelles tentatives, de journalisation et de mappage des erreurs avec des exceptions significatives garantit un processus de récupération de données fluide et fiable.
La solution PHP "Pages JSON paresseuses"
Si vous travaillez avec PHP, vous avez de la chance. Le package open source Lazy JSON Pages offre un grattoir d'API pratique et indépendant du framework qui peut charger des éléments à partir d'API JSON paginées dans une collection paresseuse Laravel via des requêtes HTTP asynchrones. Ce package simplifie la pagination, la limitation, les requêtes parallèles et la gestion de la mémoire, garantissant ainsi l'efficacité et les performances.
Vous pouvez trouver plus d'informations sur le package et plus d'options pour le personnaliser dans le fichier readme du référentiel officiel GitHub : Lazy JSON Pages.
Je tiens à remercier Andrea Marco Sartori, l'auteur du paquet.
Exemple : récupération de milliers d'histoires à partir de Storyblok
Voici un exemple concis de récupération de milliers d'histoires de Storyblok à l'aide du package Lazy JSON Pages en PHP.
Tout d'abord, vous pouvez créer un nouveau répertoire, accéder au répertoire et commencer à installer le package :
mkdir lazy-http
cd lazy-http
composer require cerbero/lazy-json-pages
Une fois le package installé, vous pouvez commencer à créer votre script :
<?php
require "./vendor/autoload.php";
use Illuminate\Support\LazyCollection;
$token = "your-storyblok-access-token";
$version = "draft"; // draft or published
$source = "https://api.storyblok.com/v2/cdn/stories?token=" . $token . "&version=" . $version;
$lazyCollection = LazyCollection::fromJsonPages($source)
->totalItems('total')
->async(requests: 3)
->throttle(requests: 10, perSeconds: 1)
->collect('stories.*');
foreach ($lazyCollection as $item) {
echo $item["name"] . PHP_EOL;
}
Ensuite, vous pouvez remplacer votre jeton d'accès, et exécuter le script via la commande php.
Comment ça marche
-
Pagination efficace : les résultats de l'API sont paginés et la collection paresseuse gère la récupération de toutes les pages sans avoir besoin de tout stocker en mémoire.
-
Appels API asynchrones : la ligne ->async(requests: 3) déclenche trois requêtes API en parallèle, améliorant ainsi les performances.
-
Limitation : la ligne ->throttle(requests: 10, perSeconds: 1) garantit que pas plus de 10 requêtes sont effectuées par seconde, dans le respect des limites de débit.
-
Efficacité de la mémoire : l'utilisation de collections paresseuses permet de traiter les données élément par élément, réduisant ainsi la surcharge de mémoire, même avec de grands ensembles de données.
Cette approche offre une solution fiable, performante et économe en mémoire pour récupérer de gros volumes de données à partir d'API en PHP.
Références
- Le package Lazy JSON Pages : https://github.com/cerbero90/lazy-json-pages
- L'auteur du package open source : https://github.com/cerbero90
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!