Chargement long à cause d'une fonction RSS

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Yünalescä, 24 Janvier 2014.

  1. Yünalescä
    Yünalescä Nouveau WRInaute
    Inscrit:
    24 Janvier 2014
    Messages:
    3
    J'aime reçus:
    0
    Bonjour,

    Je m'excuse par avance si ce sujet est mal placé (et/où que ce ne soit pas le bon endroit)
    Cela fait pratiquement deux semaines que je suis heurtée à un problème majeur. Je travaille actuellement sur Wordpress 3.8 et j'ai développé un code PHP qui me pose problème. Pour vous expliquer mon problème, j'ai actuellement 4 sites internet (Wordpress pour les 4) et je développe actuellement un "portail" qui affiche les données de mes quatre autre sites.

    Actuellement, je suis sur une fonction (dernière étape de mon développement) qui récupère le nombre de commentaire d'un flux RSS d'un site distant : celle -ci fonctionne mais le temps de chargement est très long vu qu'il y'a plusieurs articles.

    Code:
    function recupNbComment($lien_article,$titre)
    {
    	$lien_article = ("$lien_article/feed");
    	$url = $lien_article;
    	$rss = simplexml_load_file($url);
    	$mois = get_the_time('m');
    	$annee = get_the_time('Y'); 
    	$categorie_site = recupererCategorie();
    
    if (@simplexml_load_file($url))
    {
    for ($x=0; $x<200; $x++) 
    {
    	if (!isset($rss->channel[0]->item[$x])){
    			break;} 
    }
    	if ($categorie_site == 'Toto')
    		return $x;
    	if ($categorie_site == 'Tata')
    		return $x;
    	}
    	if ($rss == false)
    	{
    		return 'Erreur'; 
    	}
    }
    (J'ai allégé le code mais l'esprit est là). Le problème est que le temps de chargement est long vu que je fais passer "lien_article" donc on vérifie plusieurs fois pour afficher le nombre de commentaire de mon Flux RSS d'un site distant.

    Je fais appel à vous pour répondre à plusieurs interrogations :

    1. Est-il possible de mettre la fonction en cache et comment ? Comme ça, l'appel ne se fait qu'une fois par heure (ou jour) et le temps de chargement serait diminué ?
    2. Avez-vous un autre moyen de récupérer les données d'un flux RSS commentaire wordpress en vérifiant une fois par heure (par exemple)
    3. J'ai pensé à une connexion vers une base de donnée distante mais à mon avis ça sera le même problème vu qu'il faut connecter 4 BDD à chaque fois ?

    Si vous avez des solutions, je suis preneuse de tout =)
     
  2. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 190
    J'aime reçus:
    1
    1/ regarde du côté de CRON
    2/ a mon avis c'est une mauvaise idée de récupérer tes données a travers un flux il serait plus judicieux de taper directement dans la base de données pour sortir tes datas. ce qui m'amène au point 3
    3/ si tes sites ne sont pas sur le même serveur et / ou qu'il ne peuvent pas communiquer librement et surtout accéder entre eux aux bases de données, il est surement plus simple de créer des petits script indépendants (wrapper) sur chaque site qui ne renvoient que le stricte necessaire en se connectant a la base. Ta fonction principale distante ne ferait que récupérer par dessus http le résultat pour l'afficher.

    Dans tous les cas il faut éviter ça a chaque consultation de page donc en effet il faut prévoir un dispositif de "cache" qui conserve l'info formatée accessible et qui est renouvelée via une tache CRON.

    ça ça craint :D
     
  3. Yünalescä
    Yünalescä Nouveau WRInaute
    Inscrit:
    24 Janvier 2014
    Messages:
    3
    J'aime reçus:
    0
    Coucou,
    Merci pour ta réponse rapide, pour te répondre :

    1. Concernant CRON, j'ai recherché sur Internet comment fonctionnait ce "système" : j'ai compris comment cela fonctionne mais je n'ai pas compris comment le mettre sur pieds.

    2. En effet, tu as raison : je viens à l'instant de modifier mon code pour rechercher directement aux BDD (les quatre sites sont sur le même serveur + hébergement mais NDD différent) :

    Code:
    if ($categorie_site == 'toto')
    {try	
    {
        $bdd = new PDO('mysql:host=localhost;dbname=toto', 'util', 'mdp');
    }
    catch (Exception $e){
      die(0 Commentaire);
    }
     $reponse = $bdd->query('SELECT * FROM warlock_posts');
    while ($donnees = $reponse->fetch())
    {
    ?>
    <?php if (($donnees['post_name']) == $titre)
    	echo ($donnees['comment_count']);
    ?>
    <?php}
    $reponse->closeCursor(); // Termine le traitement de la requête
    }
    Alors, ça fonctionne encore une fois, j'ai gagné pratiquement 12 secondes sur le chargement (désormais ~5sec pour charger le site sans aucun cache) mais :

    -- Il y'a 7 "IF" de Catégorie
    -- 4 Connexions aux 4 BDDs + Recherche query
    -- Appel de la fonction 8 fois

    ça semble beaucoup trop quand même et je pense qu'il faut que je mette en cache avec "CRON" mais j'ai aucune piste par quoi commencer :D

    Quoi qu'il en soit, merci beaucoup pour ta réponse ;)
     
  4. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 190
    J'aime reçus:
    1
    Ouch !!! ça c'est de la requête pas optimisé du tout :D . Je connais pas ta structure mais disons qu'en triant et groupant tu a surement la possibilité (par site) de ne renvoyer que le résultat que tu souhaite ce qui économiserait du code php (mais déporterait le souci sur la base ce qui n'est pas forcement compliqué pour elle)

    Après je ne peux pas t'en dire plus sans connaitre la structure et les datas plus le format de sorti.

    -- "Il y a 7 if de Catégorie" > groupement dans la requête :?:
    -- "4 Connexions aux 4 BDDs + Recherche query" > ça tu n'y coupera pas si tu as 4 bases mais disons que de mon point de vu c'est pas le pire si le reste du site tiens la route.
    -- "Appel de la fonction 8 fois" > là je ne comprend pas.

    C'est dur de te conseiller car c'est assez obscur comme problème. Quoi qu'il en soit perso quand je dois gérer du cache Cela consiste souvent a écrire un fichier sur le disque du serveur (fichier parfaitement identifiable et précis voir fopen() et fwrite())
    Le fichier peut être de tout type :
    * php si je dois l'inclure et faire un traitement avec,
    * txt si c'est juste du contenu a manipuler,
    * html si c'est une sortie que je vais renvoyer brute etc ...
    (bref ça dépend du "quoi" qui viens ensuite) Le truc c'est dans tous les cas de produire un fichier qui va m'éviter 100% des traitements logiciel lors de son utilisation.

    Bon après si je comprend bien tu as 4 Wp plus un portail "maison". Si les 5 domaines sont sur le même hébergement cela ne pose pas de souci au contraire car un script (même hors du champ apache donc inaccessible depuis le web) peut se charger de créer le cache et de formater les données. Le site portail pourra normalement très bien lire le cache a tout moment et l'afficher.

    Reste le CRON. Dans le principe c'est pas compliqué mais :
    * Il faut un accès SSH
    * se démerder un peut avec VI si possible (éditeur de texte en ligne de commande)
    * connaitre la syntaxe d'une ligne de config du cron.

    en gros :
    1/ ssh <user>@domaine -> tu te connecte au serveur un mot de passe te sera demandé.
    2/ crontab -e -> lance l'édition du "fichier de config" du cron (c'est là que tu te retrouve sous l'éditeur texte si tu appuie sur [insert] )
    3/ il faut ensuite introduire une ligne destinée a appeler ton script php a une date / heure / fréquence précise c'est du genre : "mm hh jj MMM JJJ tâche" (dixit wiki)
    un exemple :
    10 13 * * * php -f /ton/dossier/de/script/script-cron-job.php
    cette ligne dans la table CRON lancera "script-cron-job.php" situé dans le dossier "/ton/dossier/de/script/" sur ton serveur tous les jours a 13H10. "php -f " permet de "lancer" le script.
    4/ quand tu a mis correctement ta ligne faut sortir en enregistrant chez moi (Vi c'est [echap](sortir du mode édition) + :(passer en mode commande) + q(commande quit) + [enter](valider) )
    5/ tu est donc revenu sous ta console ssh là un crontab -l permet de vérifier de visu que ton fichier cron est bien correct.

    A ce stade tu aura un script destiné a construire ton cache tous les jours mais tu peux bien sur régler ça pour que ça le face toutes les heures ou ... comme tu le sent.
    Dans ton script "script-cron-job.php" (qui va s’exécuter hors de l’environnement apache donc sans variables serveur), il faut que tu te démerde pour consulter la base proprement et générer le fichier de cache.

    Si tu arrive a générer le fichier de cache alors ton portail aura juste a l'inclure ou le lire ou ... pour afficher ce que tu as préparé.

    Abuse pas sur la fréquence des CRON si ton script est mal biglé ça pompe.
     
  5. Yünalescä
    Yünalescä Nouveau WRInaute
    Inscrit:
    24 Janvier 2014
    Messages:
    3
    J'aime reçus:
    0
    Bonjour,

    Après avoir travaillé sur les pistes de ta réponse, j'ai résolu mon problème ! Merci beaucoup ;)
    En effet, ma requête était pas optimisée et j'ai fais une requête plus sélective et ça marche très bien. (Chargement de 0,2ms à 0,7ms mais c'est très correct sans cache)

    Concernant le CRON, j'ai regardé mais j'ai pas encore compris. Quoi qu'il en soit, je n'ai plus besoin de ça pour le moment, je sais maintenant qu'il existe cette possibilité à l'avenir si j'en ai besoin.

    Encore merci pour ta réponse, j'ai vu beaucoup plus clair.

    Sujet Résolu !
     
  6. forty
    forty WRInaute passionné
    Inscrit:
    30 Octobre 2008
    Messages:
    1 929
    J'aime reçus:
    0
    sans cron il y a aussi moyen de générer un cache à intervalle régulier (il y a un bout de code simplissime dispo sur le forum mais je ne sais plus ou). Le principe est d'ajouter un petit bout de code en début de ton script qui recherche si un fichier cache existe et pas trop ancienne (à toi de définir un temps d'expiration). Si oui retourne le contenu du fichier et sort. Sinon fait le traitement normal pour générer le contenu de la page. Un petit bout de code en fin de traitement sauvegarde le fichier cache. Au final un utilisateur toutes les X heures va avoir le temps de chargement max et tous les autres le temps de lecture d'un fichier. L'optimisation ultime c'est de retourner le dernier fichier cache systématiquement dès que ton traitement rencontre une erreur php ou mysql.

    Sinon pour le cron il existe des outils en ligne qui permettent d'appeler une url automatiquement à intervalles régulier (toutes les heures au maximum normalement). OVH propose aussi un outils pour ça dans le manager.
     
  7. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 361
    J'aime reçus:
    2
    Dans ce cas, LA bonne solution est de passer en multisite avec domain mapping. Il y a ensuite plein d'outils développés pour permettre d'afficher ce type d'informations "portail"
     
Chargement...
Similar Threads - Chargement long cause Forum Date
Temps de chargement trop long Problèmes de référencement spécifiques à vos sites 23 Février 2017
Chargement ajax trop long Développement d'un site Web ou d'une appli mobile 11 Février 2015
Chargement composants par JS (fetch) - indexation dans Google Crawl et indexation Google, sitemaps 9 Octobre 2020
Search Console Problèmes chargements images Crawl et indexation Google, sitemaps 3 Septembre 2020
WordPress optimisation des temps de chargements Débuter en référencement 28 Juin 2020
Vitesse du site, temps de chargement etc Débuter en référencement 18 Février 2020
Chargement des pages, ton site tu optimiseras Référencement Google 27 Décembre 2019
Chrome va identifier les sites dont le chargement est lent Référencement Google 13 Novembre 2019
Test d'optimisation mobile : Problèmes de chargement de la page Débuter en référencement 10 Novembre 2019
KPI Temps de chargement moyen de la page Google Analytics Google Analytics 15 Octobre 2019