Charger une page et garder les informations

POO & JSON

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J’ai créé une class php pour récupérer des données via une API qui renvoie les données en JSON, jusque là rien de compliquer.

Mais je viens de remarquer, qu’a chaque fois que je récupère les données, ça renvoie plusieurs requête à l’API au lieu de garder les données dans la méthode grab().

Ce n’est pas top pour l’API, car je lui demande + de 30 fois à chaque chargement de page, au lieu d’une fois qui suffirait.

Comment je peux faire pour garder les données au lieu de renvoyer une requête à chaque fois ?

Voici ma class php (simplifiée) :

<?php

class grab {

private $url;

public function __construct($url)
{
	$this->url = $url;
}

public function grab()
{
	// on récupére la page via cURL

	return json_decode($page);
}

// 1ere requête GET
public function tmdb_id()
{
	$i = $this->grab();

	return !empty($i->id) ? $i->id : 'ID TMDb inconnu';
}

// 2nd requête GET
public function imdb_id()
{
	$i = $this->grab();

	return !empty($i->imdb_id) ? $i->imdb_id : 'ID IMDb inconnu';
}

// 3eme requête GET
public function note()
{
	$t = $this->grab();

	return !empty($t->vote_average) ? $t->vote_average.'/10' : 'note inconnue';
}
+0 -0

Salut

Une des solutions serait d’utiliser un cache, ce qui techniquement peut s’implémenter de diverses manières (fichiers, base de données "usuelles" [MySQL, PostgreSQL, etc.] comme "simplifiées" [redis, MongoDB]). Dans tous les cas, avant de lancer une requête, il faut regarder si une entrée de cache correspondante existe, voir si elle est "assez jeune", et si c’est le cas alors on prend les données de cette entrée de cache. Sinon, on lance la requête et on met en cache les données reçues avant de continuer le traitement.

Le plus courant pour des architectures simples me semble être la version avec des fichiers.

+1 -0

En fonction du nombre de requêtes que tu reçois et la mémoire disponible sur la machine où tu fais tourner ton programme, tu peux aussi simplement avoir une cache en mémoire (une simple Map ferait l’affaire). En cas de besoin, tu peux implémenter une simple eviction policy afin de retirer les éléments de cette cache après un certain temps (ou quand la taille a atteint une certaine limite).

Je pense que cette approche serait beaucoup plus simple et rapide à mettre en place que d’utiliser Redis ou une BDD.

Pour cela, il faudrait que PHP propose une mémoire partagée entre threads (ou assimilé), or je n’ai pas connaissance ni n’ai déjà travaillé avec quelque chose de ce genre. Il me semble bien que PHP fonctionne par environnements séparés par requête, non ?

+0 -0

Hello,

Je crois que le principal problème c’est que tu t’attends à ce que la méthode ->grab() stocke le résultat de ta requête pour le réutiliser ensuite. Or, dans ton code cette méthode ne fait que récupérer le résultat de ta requête HTTP et le retourner. Il y a donc bien une requête HTTP émise à chaque appel de ->grab().

En partant du principe que tu n’instancie qu’un seul objet Grab lors de la génération de ta page ; La solution serait de n’appeler qu’une seule fois la méthode ->grab() par page et de stocker le résultat de ta requête dans un objet que tu réutilises par la suite.

Par exemple : (Vu le nom de tes variables je suppose que tu manipules des films)

Une classe Film pour représenter tes films ;

class Film {
  private $tdmbId;
  private $imdbId;
  private $voteAverage;
  
  public function __construct($tdmbId, $imdbId, $voteAverage){
    $this->tdmbId = $tdmbId;
    $this->imdbId = $imdbId;
    $this->voteAverage = $imdbId;
  }
  
  public function getTdmbId()
  {
    return !is_null($this->tdmbId) ? $this->tdmbId : 'ID TMDb inconnu';
  }

  public function getImdbId()
  {
    return !is_null($this->imdbId) ? $this->imdbId : 'ID IMDb inconnu';
  }
  
  public function getVoteAverage()
  {
    return !is_null($this->voteAverage) ? $this->voteAverage.'/10' : 'note inconnue';
  }
}

Ta classe Grab qui ne comporte plus qu’une seule méthode et qui retourne un objet Film.

class Grab {
  private $url;

  public function __construct($url)
  {
    $this->url = $url;
  }

  public function grab()
  {
    // on récupére la page via cURL
    $json = json_decode($page);
    return new Film($json->id, $json->imdb_id, $json->vote_average);
  }
}

Le code de ta page qui instancie un objet Grab, qui récupère un Film puis qui l’utilise pour récupérer les infos que tu souhaites.

$grab = new Grab("TON URL");
$film = $grab->grab();

$film->getTdmbId();
$film->getImdbId();
$film->getVoteAverage();

Par la suite, l’utilisation d’une solution de cache comme préconisé par Ymox te permettra de limiter encore plus l’impact sur ton API en évitant de faire ta requête à chaque fois.

@luuka merci je vais faire comme ça, j’ai essayé et ça fonctionne super , plus qu’une requête au lieu de … 30 lol l’api va me remercier ^^

les autres, ce n’était pas vraiment ça l’idée mais merci quand même pour votre implication

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte