Chargement long à cause d'une fonction RSS

Nouveau WRInaute
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 =)
 
WRInaute accro
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.

Cela fait pratiquement deux semaines que je suis heurtée à un problème majeur.
ça ça craint :D
 
Nouveau WRInaute
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 ;)
 
WRInaute accro
Yünalescä a dit:
SELECT * FROM warlock_posts
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.

Yünalescä a dit:
-- "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.

Yünalescä a dit:
mette en cache avec "CRON" mais j'ai aucune piste par quoi commencer
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.
 
Nouveau WRInaute
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 !
 
WRInaute passionné
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.
 
WRInaute accro
Yünalescä a dit:
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) :
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"
 
Discussions similaires
Haut