Parser un flux XML toutes les x Heures

Résolu
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012 - 15 juil. 2011 à 15:45
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 19 juil. 2011 à 15:04
Bonjour,
Je me lance dans le XML, et j'utilise des fichiers XML différents pour traiter des listes d'informations.
Mes fichiers pèsent près de 800ko mais je trouve les temps de traitement très long, trop long pour moi en fait, parfois, ma page met près de 10 secondes à s'afficher.

J'ai chercher un peu partout.....
il y aurait plusieurs solutions, soit je met le tout dans un BDD et j'actualise de temps en temps, soit je garde la méthode du XML mais je l'actualise de temps en temps.

Ma question est de savoir si vous pouvez me dire comment il faut faire pour conserver les fichiers XML mais les actualiser de temps en temps.

J'utilise une requête pour charger mes fichiers XML à partir d'une BDD distante sur laquelle je n'ai pas la main, l'ennui c'est que chaque fois qu'un internaute se connecte, il charge tout le xml à chaque fois ?! non ?

Pouvez vous me donner des pistes...je ne sais pas comment je peux faire pour développer tout ça.
Peut on garder en mémoire sur le serveur le fichier XML et accéder à ce fichier plutôt que de le charger à chaque fois de puis cette BDD ?
Existe t'il des scripts permettant de mettre à jour ce fichier XML toutes les x heures ou minutes ?

Merci de m'aider si vous avez des pistes car là je sèche un peu.

Merci d'avance

15 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
19 juil. 2011 à 12:09
Re,

il apparait que le dernier de mes enregistrements apparait en 2 secondes mais parfois c'est beaucoup plus long....donc c'est assez aléatoire ?!


Tu aurais intérêt à poster la structure de ton XML et la partie de code qui permet sa création (avec la requête SQL). Peut être y a t il moyen d'optimiser.

Maintenant que j'arrive à enregistrer dans mes fichiers XML je n'ai plus qu'à faire un CRON qui actualise ces fichiers, une idée pour le script en question ?

Tu l'as déjà le script en question !! :) Tu as juste à l'épurer au besoin pour qu'il ne fasse que l'interrogation DB, la mise à jour XML et la copie sur le serveur.
Reste plus qu'à paramétrer le pseudo CRON pour qu'il fasse appel à ce script toutes les 24H

Par ailleurs il faut peut réfléchir à stocker le fichier HTML généré, et non le XML, mais ça dépend de ton fonctionnement qui n'est toujours pas clair à 100% pour moi.
Si le XML sert à générer une page HTML côté serveur :

- Cron toutes les 24H => lance le script bidule.php
- bidule.php interroge la DB distante, crée le(s) XML, les enregistrent au besoin et génère le fichier HTML destiné au client. Il enregistre ce fichier HTML

- appel de la page par un utilisateur => tu balances directement le fichier HTML, sans aucun traitement à faire.



Cordialement,


Kohntark -
3
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
15 juil. 2011 à 16:29
Tu dois avoir un serveur dédié et non mutualisé pour faire cela.
Car ce n'est pas le client qui doit exécuter l'application, mais le serveur.
Par la suite, tu crées un cron, un fichier PHP à exécuter.

Bonne chance.
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
15 juil. 2011 à 18:40
Je te remercie pour ta réponse mais il est peut être possible de trouver une solution pour contourner ce problème...
Peut être que je peux enregistrer mon flux dans un fichier XML que je garde sur mon serveur, ça c'est possible.
Le seul problème est de savoir comment le mettre à jour de manière automatique ???
D'autres idées pour me faire avancer la dessus ?

Il n'y a aucun script qui permette de faire ces mises à jour ?

Ou une tout autre solution ????

Merci d'avance
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
16 juil. 2011 à 10:03
La bonne solution, c'est le cron.
Comme tu veux éliminer cette solution, mais c'est bidouillé et pas pro.

Tu peux créer une page protégée par un htaccess.
Une fois connecté, un script JavaScript asynchrone lance le script PHP, par exemple toute les 10 min.
Et bien sur, ce poste client doit resté ouvert 24h sur 24.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
17 juil. 2011 à 18:56
Il reste à savoir si c'est le temps d'accès et de rapratriement de ton fichier qui est long ou le traitement XML (parsing etc..)
Après il y a aussi la méthode que tu utilises pour interroger ton fichier. XPath ?? SimpleXML ??
Les raisons d'un tel temps sont multiples mais pas très nombreuses.
S.
0
Utilisateur anonyme
18 juil. 2011 à 15:32
Surtout, attention au hébergeur... Qui mettent eux même du temps à répondre, quand ils ne sont pas H.S (je pense au gratuits, par expérience). Car théoriquement, télécharger un fichier via un script php héberger sur un serveur, c'est passer par les gros "tuyaux" (de serveur à serveur), donc 800k c'est une broutille insignifiante (Dans mon travail, je traite des flux xml qui font jusqu'a 2 Giga!!).

Le traitement du flux, en effet, c'est peut être ça qui demande du temps. Boucler sur plusieurs centaines (milliers?) de noeud cela peux prendre beaucoup plus de temps, surtout en fonction des traitements effectué pendant cette boucle.

Romain
0
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014
18 juil. 2011 à 15:35
Bonjour,

Et pourquoi ne pas mettre en cache le fichier xml, avec une date d'expiration ? De la même manière que l'on mettrait des script PHP en cache au format HTML.




________________________________________
( $toBe || !$toBe ) = $this->Question();
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
18 juil. 2011 à 22:38
Bonjour à tous et merci pour vos pistes de réflexions.

merci stay pour ta solution, je pense en effet que le cron serait la solution la plus appropriée, même si je n'ai jamais eu à la mettre en place, de ce que j'ai lu, cela semble être la meilleure solution mais le problème est qu'il faut obligatoirement passer sur un serveur dédié et je ne peux pas le faire pour le moment...
Quant à la solution du poste client qui exécute le script, je pense que cela sera contraignant pour les utilisateurs et cela me posera également des soucis.

Peut être que je dois prendre le problème autrement, puisque mon fichier XML n'est pas si lourd que cela, je dois savoir pourquoi il est si long à s'afficher sur mon site et je voudrais bien que vous m'aidiez à éclaircir le problème s'il vous plait, étant novice en XML, je ne saurais pas isoler le problème seul.

Je ne suis pas sur un Hébergement gratuit mais sur une solution proposée par OVH avec BDD.
J'utilise la méthode SimpleXML pour traiter mon flux XML, comment puis je optimiser mes temps de traitement et savoir si la lenteur d'éxécution vient bien de là ?

L'idée d'inxebo me plait assez, mettre un fichier en cache avec une date d'expiration à 24H et recharger le fichier en cache au bout de 24H, cela est il facile à réaliser ? est ce fiable ?
Merci de m'aider sur ce sujet, toute réflexion est bonne à prendre et me permettra d'en apprendre un peut plus sur le traitement des flux XML.

Merci encore
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
18 juil. 2011 à 23:32
Salut,


Les xml sont stockés dans une DB distante, c'est bien ça ?

mais le problème est qu'il faut obligatoirement passer sur un serveur dédié

Heu, tu es sûr de toi là ? Chez OVH j'aurai eu tendance à dire qu'un planificateur de tâches existait.

Il serait bien de connaitre un peu le contenu des données que tu récupères et en quoi consiste le traitement. Changent elles souvent ? Est ce important si tu envoies des données non actualisées au client ? As tu un moyen alternatif de savoir si elles ont changées ? Du style un champ id dans la DB distante que tu pourrais interroger via un simple SELECT, tite comparaison avec valeur précédente => mise à jour , ... ou non

Avant de mettre en place le moindre truc c'est clair qu'il faut identifier d'où viennent les ralentissements.

800Ko c'est le poids de tous les XML réunis ?
... s'il s'agit de générer la page web avec ça je trouve que c'est déjà très lourd; quelques images en plus, un peu de JS, le HTML qui peut être plus conséquent que le xml ... on a vite fait de se retrouver avec une page bien trop lourde.

cela est il facile à réaliser ?

Oui, suffit juste d'enregistrer le(s) fichier(s) et tester sa date de modification à chaque connexion. Si date_modif < maintenant - 24h => on utilise ce fichier, sinon on interroge le serveur distant pour mise à jour

est ce fiable ?

... c'est juste un fichier :)
La fiabilité réside ici dans l'exigence que tu as de fournir des données à jour ou non.


savoir si la lenteur d'éxécution vient bien de là ?

Tu peux mettre des mouchards de ce type un peu partout dans le code :

[code=php]
<?php
define('START_TIME', microtime(true));
//
echo round(microtime(true)-START_TIME, 4).' sec';
//[code]
echo round(microtime(true)-START_TIME, 4).' sec';
//etc..
?>



Cordialement,

Kohntark -
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
19 juil. 2011 à 10:40
Merci kohntark,
tu m'as permis d'avancer un peu plus.
En effet, j'utilise un BDD distante et j'ai bien la possibilité d’exécuter un CRON, chose que je ne connaissais pas mais en regardant de plus prêt, je vois que mon hébergeur le propose. Je ne sais pas encore quel genre de script je peux créer mais je vais chercher un peu plus.

Mon site est un site qui véhicule des informations touristiques et il serait bien qu'il soit mis à jour au moins une fois toutes les 24h. Mes données sont composées de photos et de textes. Par exemple la liste des manifestations du secteur, une photo et une description ainsi que des informations complémentaires de géolocalisation...

Pour vérifier s'il y a eu modification ou non ?
Non je n'ai pas d'ID que je puisse interroger, je pensais faire un remplacement intégral des données de manière automatique toutes les 24H. ça c'est possible ?

Pour le script que tu m'as donné, je l'ai mis en place et il apparait que le dernier de mes enregistrements apparait en 2 secondes mais parfois c'est beaucoup plus long....donc c'est assez aléatoire ?!

Jusque là, j'interrogeais ma BDD distante, je mettais le contenu dans un fichier XML et je le parsais pour un affichage sur mon site avec une requête pour chaque connexion...
L'idéale serait de faire un enregistrement de du résultat de ma requête dans un fichier xml que je stocke sur mon serveur et que je remplace une fois toutes les 24H grace à un script contenu dans un fichier que j'exécute grâce à un CRON ? c'est bien la bonne démarche ? désolé, je débute dans ce mode de programmation, ce sera ma première fois

J'ai déjà regardé du côté de l'enregistrement de mon fichier XML et j'éprouve déjà des soucis. N'y a t'il pas de fonction prédéfinis PHP pour cela ? en concernant la structure initiale de mon arborescence XML ?

Merci d'avance
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
19 juil. 2011 à 11:08
ça y est, j'ai trouvé comment enregistrer dans un fichier XML tout en concervant la structure XML de mon fichier grâce à une fonction php que voici : (ça pourra peut être en aider d'autres)

<? ################  FONCTION DE CREATION DE FICHIER XML #########################
function creerFichier($fichierChemin, $fichierNom, $fichierExtension, $fichierContenu, $droit=""){
$fichierCheminComplet = $_SERVER["DOCUMENT_ROOT"].$fichierChemin."/".$fichierNom;
if($fichierExtension!=""){
$fichierCheminComplet = $fichierCheminComplet.".".$fichierExtension;
}
 
// création du fichier sur le serveur
$leFichier = fopen($fichierCheminComplet, "wb");
fwrite($leFichier,$fichierContenu);
fclose($leFichier);
 
// la permission
if($droit==""){
$droit="0777";
}
 
// on vérifie que le fichier a bien été créé
$t_infoCreation['fichierCreer'] = false;
if(file_exists($fichierCheminComplet)==true){
$t_infoCreation['fichierCreer'] = true;
}
 
// on applique les permission au fichier créé
$retour = chmod($fichierCheminComplet,intval($droit,8));
$t_infoCreation['permissionAppliquer'] = $retour;
 
return $t_infoCreation;
}
?>


Dans l'appel de ma fonction, il me manquait cette ligne : $fichierContenu = $xml->asXML();
$fichierChemin = "/MonRepertoire";
$fichierNom = "nomdufichier";
$fichierExtension = "xml";

$fichierContenu = $xml->asXML();

$droit = "0777";
$t_infoCreation = creerFichier($fichierChemin, $fichierNom, $fichierExtension, $fichierContenu, $droit);
echo "";
print_r($t_infoCreation);
echo "

";


Maintenant que j'arrive à enregistrer dans mes fichiers XML je n'ai plus qu'à faire un CRON qui actualise ces fichiers, une idée pour le script en question ? Merci
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
19 juil. 2011 à 12:02
Mes problèmes de lenteur sont bien résolus et je vous en remercie, ça n'a rien à voir, ma page s'affiche tout de suite, sans délais de chargement, enfin transparent pour l'utilisateur...

Par contre, il faut toujours que je créé mon fichier CRON, cela peut être un script PHP classique ?
Sur la formule de mon hébergement il ne me propose que d'exécuter le CRON une fois par jour, n'y a t'il pas moyen de le faire plus souvent ? Avec une autre formule d'hébergement ?

merci encore de votre aide
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
19 juil. 2011 à 12:15
Oups, pas vu ton dernier message.

Sur la formule de mon hébergement il ne me propose que d'exécuter le CRON une fois par jour, n'y a t'il pas moyen de le faire plus souvent ? Avec une autre formule d'hébergement ?

Ca c'est ton hébergeur qui peut le dire.
J'ai aussi un compte mutualisé chez OVH (240plan) que je viens de regarder: je peux enregistrer toutes les heures, toutes les 2 heures, etc ... et même toutes les 0 heures ^^


Cordialement,

Kohntark -
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
19 juil. 2011 à 14:39
merci beaucoup, j'y vois beaucoup plus clair, et le temps gagné sur le chargement de mes fichiers et impressionnant...Je vois avec mon hébergeur si je peux changer de solution pour exécuter un cron plus régulièrement.

Je ne savais pas non plus qu'un cron était un fichier php ou autre tout simple, j'ai beaucoup appris en peu de temps grâce à vous et je vous en remercie.

J'ai tout de même une dernière interrogation, sur un plan de sécurité, si ma BDD est inaccessible, ce qui arrive quelque fois, et que mon cron passe à ce moment là, il risque de me remplir un fichier vide ? non ?
Quelle solution pourrait me permettre de paré à cela ?
Une sécurité du genre, si résultat de la requête est vide ou inaccessible alors on garde le fichier existant...

Merci encore, c'est toujours aussi agréable de voir qu'on peut compter sur une communauté de développeurs pour nous donner des coups de main et nous aider à apprendre chaque jour.

Merci
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
19 juil. 2011 à 15:04
Quelle solution pourrait me permettre de paré à cela ?


Réponse =>
"Une sécurité du genre, si résultat de la requête est vide ou inaccessible alors on garde le fichier existant... "

Si la requête de connexion génère une erreur ... tu ne fais rien
Si un count() du nombre de résultats est 0 ... tu ne fais rien
... enfin tu ne fais, tu peux toujours t'envoyer un mail, consigner ça dans un fichier log, etc ...

Etant donné qu'on ne connait pas le type de base de données dont il s'agit ni quel procédé tu utilises pour t'y connecter et l'interroger on ne peut t'en dire plus, mais bon, ce ne sont que des tests des retours de fonctions type *_connect(), ...

Je ne savais pas non plus qu'un cron était un fichier php ou autre tout simple, j'ai beaucoup appris en peu de temps grâce à vous et je vous en remercie.

Oui, enfin ce n'est pas exactement ça; les tâches planifiées / Cron sont des "processus systèmes" qui exécutent ce que tu leurs demandes à l'instant x. En l'occurrence tu demandes l'exécution d'un fichier PHP, mais tu pourrais très bien exécuter un .SQL, ou, hors contexte serveur, ouvrir un word, lancer un diaporama, ... bref, tout ce qui est exécutable par la machine.

Enfin, je reviens tout de même sur le fait que tu devrais identifier d'où viennent ces ralentissements. Un cron s'est bien beau mais ça ne fait peut être que masquer un problème qu'il serait possible de régler.
Imagine un problème de boucle qqpart dans ton code, qui évolue exponentiellement au regard du nombre d'enregistrements.
La base distante grossie quelque peu et hop, ça plante de ton côté en accrochant le time limit ou les ressources serveur :(
... tu es déjà à 10 secondes, c'est beaucoup.


Cordialement,

Kohntark -
0
Rejoignez-nous