Fork me on GitHub




(1) 2 »


parser un fichier depuis un site externe
Aspirant
Inscrit: 11/11/2010 14:56
Messages: 78
Bonjour tout le monde.

je suis entrain d'encoder un code php pour pouvoir afficher des blocks depuis des sites externes j'ai besoin de votre aide.

j'ai commencé par créer une table dans ma base de donnée nommée source_url avec deux colonnes id et url.

première question c'est quoi le code a faire pour avoir un array sous forme
$aurls = array( "http://www.link1.com/1.xml" => 1"http://www.link2.com/1.xml" => 2"http://www.link3.com/1.xml" => 3"http://www.link4.net/1.xml" => );


pour l'utiliser par la suite dans une boucle foreach de la forme.

foreach ($aurls as $url => $v) { echo $url; echo $v; }


dans la boucle j'ajoute la class

require_once(XOOPS_ROOT_PATH."/class/snoopy.php");
$snoopy = new Snoopy;
$kkk $snoopy->fetch($url);
$kkk5 $snoopy->results;
$xml = new SimpleXMLElement$kkk5 );



le bute et de parser des ficher xml et afficher leurs continu ça marche j'arrive a afficher le contenu des 4 fichiers mais ça prend trop de temps plus que 40 secondes pour les 4 links. Je viens de trouver une autre méthode soit disons plus rapide.

//create the multiple cURL handle
$mh curl_multi_init();


qui a une idée et comment l'utiliser pour parser les 4 links en moins de temps si c'est possible bien sûr.

j'ai cherché partout mais je trouve pas de piste malheureusement il y a peut de documentation pour xoops.

Posté le : 11/10/2012 21:42
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Admin Frxoops
Inscrit: 04/03/2011 09:10
De Lot
Messages: 2837
ce n'est pas de la documentation pour Xoops que tu as besoins mais sur 'curl', commence donc par cette page qui explique la syntaxe de 'curl'.

J'utilise un système un peu de ce genre, mais je l'effectue a part. Tous les X heures, mon serveur dédié (malheureusement cela ne marche que sur serveur dédié) lance un script qui vérifié si il y a de nouvelles données sur les flux XML, si oui le script les stocks dans la base de données. Ensuite lorsque Xoops a besoin des données, au lieu d'aller les chercher sur le Flux il va les chercher dans la base de données. C'est sur le principe d'un cache, c'est beaucoup plus rapide.

Dans ton cas, tu peux peut-être rajouter une fonctionnalité qui récupère les données de tes flux XML lors d'une première visite, ensuite tu les stocks en BDD pour les suivants. Car le délai d’exécution dépends notamment de la vitesse d'affichage de tes flux, donc de la vitesse du script qui les génère.

Posté le : 12/10/2012 10:26
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Aspirant
Inscrit: 11/11/2010 14:56
Messages: 78
c'est exactement se que je voulais faire je vois pas comment vérifier s'il y a de nouvelles données sur les flux XML. Je sais pas si c'est mieux de l’exécuter chaque heure ou bien chaque fois que quelqu’un affiche la page index.php, théoriquement il y'a une nouvelle donnée tout les 20 secondes. J'ai déjà un dédié tu peux me donner le code que tu utilise.
merci Montuy.


Posté le : 12/10/2012 11:02
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Admin Frxoops
Inscrit: 04/03/2011 09:10
De Lot
Messages: 2837
Pour cela il faut que les paquets php5-cli et cron soient installer sur ton serveur dédié (le nom des paquets sont données pour un serveur Debian Linux).

Ensuite pour la réalisation du script PHP, je te conseille d'utiliser la date et l'heure comme référence. Il vérifie si depuis la dernière exécution du script (faut que ton script note l'heure de son exécution quelques part) il y a des nouvelles publications sur le ou les flux XML. Et si c'est le cas il le stocke en base de donnée. J'ai mis ici une partie du script que j'utilise.

Ensuite suffit de créer une tâche cron a intervalle régulier qui appelle le script PHP que tu vient de créer, tu pourras trouver des informations sur cron sur cette page que j'ai créé

Posté le : 13/10/2012 10:00
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Aspirant
Inscrit: 11/11/2010 14:56
Messages: 78
Bonsoir
voilà je viens d'essayer pas mal de calss pour parser un xml. finalement j'ai décidé d'appliquer ce code
$aurls = array( "http://www.link1.com/rss" => 154,
"http://www.link2.com/10.xml" => 155,
"http://www.link3.com" => 156,
"http://www.link4.com" => 157,
 
"http://www.link5.com" => 162,
"http://www.link6.com" => 163,
"http://www.link8.com" => 164,
"http://www.link7.com" => 165,
 
"http://www.link9.com" => 166,
 
"http://www.link10.com" => 167,
"http://www.link11.com" => 168,
// "http://link12.com" => 169 );
$i=0;
$multiCurlcurl_multi_init(); 
foreach (
$aurls as $url => $v) {
 
$curls[$i] = curl_init();
 
curl_setopt($curls[$i], CURLOPT_URL$url);
 
curl_setopt($curls[$i], CURLOPT_HEADER0);
 
curl_setopt($curls[$i], CURLOPT_RETURNTRANSFERtrue);
 
curl_multi_add_handle($multiCurl,$curls[$i]);
 
$i+=1; } /*** Exécute le gestionnaire de connexion */ 
$running=null;
 do
 { 
curl_multi_exec($multiCurl,$running);
 } while (
$running 0);
 for(
$j=0$j<$i$j++){ $page[]=curl_multi_getcontent($curls[$j]); 
curl_multi_remove_handle($multiCurl$curls[$j]); 
$ok = new SimpleXMLElement$page[$j] ); 
foreach(
$ok->channel->item as $item){
 
$title $item->title;
 
$guid $item->guid;
 
$link $item->link;
 
$description1 $item->description;
 
$pubDate $item->pubDate;
 
$Date time();
 
$titleexist " SELECT lid FROM " $xoopsDB -> prefix'test_article_xml' ) . " WHERE link_articlexml = '" addslashes($link) . "'"$resultexist $xoopsDB->query($titleexist); $filecount $xoopsDB -> getRowsNum$resultexist );
 if (
$filecount == 0) { //fonction insert 
echo ' pas enregistre '; }
 if (
$filecount == 1) { //fonction ignorer
 
echo ' deja enregistre '; }
 if (
$filecount 1) { //fonction delete
 
echo ' deja enregistre plusieurs fois '; } 
} }
 
/*** Ferme les gestionnaires */
 
curl_multi_close($multiCurl);


ça me donne exactement se que je voulais mais ça prend trop de temps pour s’exécuter dans le mode debug ça me donne 0.12 ~~0.19 seconde pour chaque requête

$titleexist " SELECT lid FROM " $xoopsDB -> prefix'test_article_xml' ) . " WHERE link_articlexml = '" addslashes($link) . "'";
 
$resultexist $xoopsDB->query($titleexist);
 
$filecount $xoopsDB -> getRowsNum$resultexist );


c'est a dire en vérifiant si l'article est enregistré dans la base donnée ou pas. pour 50 item * 10 feed * 0.15 requête = 75 secondes. avec la méthode SELECT count(*) ça donne la même chose. j'ai mis une limite de 5 item donc le temps devient environ 6 ou 7 secondes c'est acceptable a mon avis.
bon maintenant il reste 2 choses a régler.
dans la fonction insert comment je peux insérer le key $v pour chaque url disons catégorie.
la requête a faire sur ma base de donnée pour obtenir un array sous forme de
$aurls = array( "http://www.link1.com/rss" => 154,
 
"http://www.link2.com/10.xml" => 155,
 
"http://www.link3.com" => 156,
 
"http://www.link4.com" => 157,
 
"http://www.link5.com" => 162,
 
"http://www.link6.com" => 163,
 
"http://www.link8.com" => 164,
 
"http://www.link7.com" => 165,
 
"http://www.link9.com" => 166,
 
"http://www.link10.com" => 167,
 
"http://www.link11.com" => 168,
 
// "http://link12.com" => 169 );


>>pour toute autre suggestion je suis preneur.
Merci

Posté le : 13/10/2012 21:10
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Admin Frxoops
Inscrit: 04/03/2011 09:10
De Lot
Messages: 2837
pour ma part, comme précédemment dis, je noterai avant la dernière date d’exécution de ton script (en timestamp), cela fait une requête. Ensuite j'ignorerai tout le contenu que les flux m'envoies étant antérieur à la date de référence. (Pas de besoin de requête pour vérifier si l'info se trouve dans la BDD, vu qu'elle est sensé y être.
De plus tu devrais tout faire en mémoire (grâce aux tableaux) et effectuer la requête d'insertion tout a la fin .

En résumé je te retrace l'histoire :
1) $tableau1 -> mes URL des flux
2) je vais chercher le timestamp de la dernière exécution qui servire de temps de référence
3) $tableau2 -> tableau des résultats du parsage des flux
4) $tableau3 -> ce qu'il y a en BDD (exemple les 200 derniers et cela fait une requête de plus)
5) je fait chaque ligne du tableau2
6) si la date de la ligne du tableau2 est antérieure au temps de référence, j'ignore la ligne.
7) si le titre (par exemple) se trouve dans le $tableau3, j'ignore la ligne
8)si je dois garder la ligne je le mets dans le $tableau4 qui sera les infos a mettre dans la BDD
9) si le $tableau2 n'est pas terminé je retourne à l'étape 5
10) je mets les n lignes du $tableau4 dans la BDD (n requêtes)

Voilà comment je ferais

Posté le : 13/10/2012 22:22
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Aspirant
Inscrit: 11/11/2010 14:56
Messages: 78
Merci montuy je vois ton idée, en php ça donne quoi si t'as le code direct je serai reconnaissant.

Posté le : 13/10/2012 23:14
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Aspirant
Inscrit: 11/11/2010 14:56
Messages: 78
J'arrive finalement waw. j'ai appliqué ton demarche et ça marche perfect pas plus que 2 secondes. grand merci pour montuy. il me reste un petit probleme c'est comment obtenir l'array des link a partir de la base de donnée.

if ( time() >= $last_run1 + (60 5)) { // 60 * 5 is 5 minutes
$sql10 'SELECT * FROM ' $xoopsDB -> prefix'article_categorie' ) . ' where blog != "" ';
 
$result10 $xoopsDB -> query$sql10);
 
$f=0;
 while(
$arr10 $xoopsDB -> fetchArray$result10 )){
 
$urls[$f] = $arr10['blog'];
 
//var_dump($urls[$f]);
 
$f++; }




$url $arr['blog'];

//je tombe sur un array simple.

$aurls = array( "http://www.link1.com/rss""http://www.link2.com/10.xml""http://www.link3.com""http://www.link4.com""http://www.link5.com""http://www.link6.com""http://www.link8.com""http://www.link7.com""http://www.link9.com""http://www.link10.com""http://www.link11.com"// "http://link12.com" );


je le veut comme ça merci et bonne soirée.


$aurls = array( "http://www.link1.com/rss" => 154"http://www.link2.com/10.xml" => 155"http://www.link3.com" => 156"http://www.link4.com" => 157"http://www.link5.com" => 162"http://www.link6.com" => 163"http://www.link8.com" => 164"http://www.link7.com" => 165"http://www.link9.com" => 166"http://www.link10.com" => 167"http://www.link11.com" => 168// "http://link12.com" => 169 );

Posté le : 15/10/2012 01:03
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Admin Frxoops
Inscrit: 04/03/2011 09:10
De Lot
Messages: 2837
Citation :

c'est comment obtenir l'array des link a partir de la base de donnée


j'ai pas tous compris, là, je sais, c'est le lundi matin, mais est-ce que tu peux plus clair dans ce que tu veux ?

Posté le : 15/10/2012 07:38
Partager Twitter Partagez cette article sur GG+
Re: parser un fichier depuis un site externe
Aspirant
Inscrit: 11/11/2010 14:56
Messages: 78
j'ai une table nommé article_categorie composée et 3 colonnes id, name et feed. je veux avoir un array composé de tous les feed avec le id qui lui correspond pour l'utiliser par la suite dans une boucle foreach et utiliser le $key et le $value comme je veux($key correspond a id et $value correspond au feed).

j'ai essayé avec cette requête mais l'array de sortie est composé seulement des feed pas de id.

$sql10 'SELECT * FROM ' $xoopsDB -> prefix('article_categorie' ) . ' where feed != "" ';
 
$result10 $xoopsDB -> query$sql10);
 
$f=0;
 while(
$arr10 $xoopsDB -> fetchArray$result10 )){
 
$urls[$f] = $arr10['feed'];

 
$f++;
 }
 
var_dump($urls);

foreach (
$urls as $key => $url) {
echo 
$key;
echo 
'<br>';
echo 
$url;
}

/////////////////////////////////
//je tombe sur un array simple./
////////////////////////////////

 
$urls = array( 
 
"http://www.link1.com/rss",
 
"http://www.link2.com/10.xml",
 
"http://www.link3.com",
 
"http://www.link4.com",
 
"http://www.link5.com",
 
"http://www.link6.com",
 
"http://www.link8.com",
 
"http://www.link7.com",
 
"http://www.link9.com",
 
"http://www.link10.com",
 
"http://www.link11.com",
 
// "http://link12.com" );


ce que je veux c'est un array sous forme de

$urls = array( 
 
"http://www.link1.com/rss" => 154,
 
"http://www.link2.com/10.xml" => 155,
 
"http://www.link3.com" => 156,
 
"http://www.link4.com" => 157,
 
"http://www.link5.com" => 162,
 
"http://www.link6.com" => 163,
 
"http://www.link8.com" => 164,
 
"http://www.link7.com" => 165,
 
"http://www.link9.com" => 166,
 
"http://www.link10.com" => 167,
 
"http://www.link11.com" => 168,
 
// "http://link12.com" => 169 );


j'ai déjà essayé pas mal de chose mais le $key prend toujours le nombre de l’itération c'est dire 0 1 2 3 4 5 6 7 8 9, je veux que $key prend le id de la categorie. Merci

Posté le : 17/10/2012 00:28
Partager Twitter Partagez cette article sur GG+

 Haut   Précédent   Suivant
(1) 2 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

112 Personne(s) en ligne (95 Personne(s) connectée(s) sur Forum) | Utilisateur(s): 0 | Invité(s): 112 | Plus ...