2017-01-24 1 views
-1

Bonjour J'ai un site Web qui charge les données d'une API pour afficher les dernières statistiques. Je le stocke pendant 10 minutes pour éviter de charger des appels api à chaque fois. Comme il y a beaucoup d'appels api, il faut au moins 5-10 secondes pour finir de charger le site web qui a l'air d'être en panne. Actuellement, j'utilise php pur pour les fonctionnalités. Il existe des fonctions comme GetTotalEarnings() - juste un fichier file_get_contents ($ url) pour recevoir un contenu json et le décoder et le mettre à une table que je peux utiliser pendant 10 minutes. Au bout de 10 minutes, il appellera à nouveau tous les apis pour rafraîchir les valeurs (si la page est rechargée bien sûr).PHP comment définir le contenu plus tard ou si est chargé?

Pour résoudre ce problème, mon idée était de charger le contenu en premier et d'afficher le contenu, puis de charger les données pour définir les valeurs plus tard. Mais je ne sais pas par où commencer. Je sais que jquery peut le faire avec un rappel mais son javascript. Je ne sais pas ce que tot y faire

Deux exemples comment ressemble actuellement

<h1 class=""><center>Earnings Total: <?php echo GetTotalEarnings() . " (Latest update: " . GetLatestUpdateTime() . ")"; ?></center></h1> 


<h1 class="">This Month</h1> 
<div class="col-xs-6 col-sm-6 col-md-3"> 
    <div class="box c1 center-block"> 
     <h4 class="blue">Today</h4> 
     <span class="icon blue"><i class="fa fa-usd"></i></span> 
     <span class="price-large blue"><?php echo round(GetTodayEarnings(), 2); ?></span> 
    </div> 
</div> 
+0

Si vous voulez obtenir des données toutes les 10 minutes, il semble qu'un travail CRON serait mieux adapté à vos besoins.Cela permettrait également d'accélérer le frontal car l'utilisateur n'aurait pas à attendre que les données soient téléchargées, comme cela aurait déjà été fait en arrière-plan. –

+0

Ce n'est pas le problème. J'ai fait un fichier où je stocke les données pendant 10 minutes. Une fois le temps écoulé, la page est rechargée afin que le fichier soit actualisé. Je ne veux pas utiliser cron job. C'est ok pour moi si toutes les données sont mises à jour à la volée. – MaZy

+0

Donc, vous savez que vous voulez utiliser javascript et peut-être JQuery, mais vous ne savez rien de ces langues! Vous devrez donc vous procurer un livre et/ou faire des tutoriels en ligne. SO ** n'est pas ** un site tutoriel, et nous ne ** écrivons pas le code pour vous gratuitement ** – RiggsFolly

Répondre

1

Au lieu de demander les données de l'API sur une demande de l'utilisateur, je place un script/programme arrière-plan toutes les 10 minutes qui met en cache les résultats dans memcached ou MySQL. Ensuite, lorsqu'un utilisateur demande les données, renvoyez les résultats mis en cache. Si l'API prend plus de 10 secondes à traiter, alors sans regarder le code pour potentiellement l'optimiser, nous devons supposer 10 + secondes est juste combien de temps il faut pour traiter. La mise en cache est le seul moyen d'accélérer la demande de l'utilisateur sans optimiser l'API.

Vous pouvez utiliser JavaScript pour charger le script async puis modifier le document une fois la page chargée. Voici un exemple utilisant Jquery.

$(document).ready(function(){ 
     $.ajax({ 
      type: "GET", 
      url: "myApiCalls.php", 
      dataType: 'json', 
      data: queryString, 
      success: function(data) { 
       // ... 
      } 
     }); 
}); 
+0

Merci. La raison est pourquoi j'essaie d'éviter quelque chose comme cronjobs est ce que si je décide d'avoir les données en temps réel. Je veux voir les changements sur chaque rechargement. De plus, les requêtes API n'ont pas toujours 10 secondes à traiter. Certains d'entre eux sont instantanés et certains prennent un peu de temps. C'est pourquoi j'ai pensé à charger les données "plus tard" au contenu ou mettre à jour le contenu plus tard. Ok, ça marche. J'ai besoin d'utiliser jquery/ajax. Si jquery peut appeler des fonctions de php ce serait parfait. Je vais essayer – MaZy

0

Merci à @Leon Storey, en lisant sa réponse avec « données: queryString, » et lui répondre moi avons eu une bonne idée que je veux montrer ici ofc pour les personnes qui a trop le problème. Pour les gens comme @RiggsFolly, les choses que je voulais juste utiliser une copie copier ici obtenir des codes écrits pour moi et me juger d'abord sans comprendre le problème (avec même "-1" je pense) je voulais dire encore: Mon problème était que j'ai beaucoup de fonctions PHP définies qui demande des données à partir d'une API externe (actuellement je stocke les données pendant 10 minutes, en ce moment il n'utilisera pas l'API). Puisque j'ai dit que je veux d'abord charger le contenu puis mettre à jour les valeurs comme les nombres avec les demandes, je ne savais pas par où commencer à travailler dessus et l'utiliser avec jquery ou peut-être avec d'autres idées. Je voulais juste savoir ce qui est possible.

Maintenant, ce que j'ai fait pour résoudre ce problème. Php a deux grandes fonctions.

function_exists("func"); 

call_user_func("func"); 

avec ajax ensemble, je fait ce

$(document).ready(function(){ 
    $.ajax({ 
     type: "post", 
     url: "apicalls.php", 
     data: {callfunction: 'GetTotalEarnings'}, 
     success: function(data) { 
      alert(data); 
     } 
    }); 
}); 

Cela donnera une alerte si la demande de api est fait. Maintenant, voyons le apicalls.php

include "apirequest.php"; 

if(isset($_POST['callfunction'])) { 
    $func = $_POST['callfunction']; 

    if(function_exists($func)) { 
     echo call_user_func($func); 
    } else { 
     die("This function does not exists"); 
    } 
} 

Cela signifie que je ne ai pas besoin de réécrire mon fichier php « de apirequest ». Je viens d'utiliser un petit assistant comme un pipeline pour le laisser fonctionner avec des requêtes ajax. Le problème est maintenant complètement résolu

+0

Il y a un problème de sécurité potentiel dans le fait que vous ne vérifiez pas les données externes dans '$ _POST', si quelqu'un connaît les fonctions utilisées dans votre script, il pourrait les appeler comme bon lui semble. Tels que 'apicalls.php? Callfunction = MySuperSecretFunction'. Vous pouvez vouloir vérifier un 'tableau 'de fonctions accessibles au public. –

+0

Oui, je pensais déjà à ce sujet. Je viens de prendre toute la fonction restreinte là-bas. Il n'y a que "Gets" pour api qui va bien. Mais à l'avenir, je vais changer de tableau ou quelque chose comme ça. – MaZy