Aller au contenu

Sujets conseillés

Posté

bonjour,

Actuellement je parse un fichier xml en php, en faisant une mise en cache du code généré. Cependant maintenant le fichier xml devient un peu long. Je voudrais donc le parser sur plusieurs pages? Afficher par exemple 20 résultats par page.

Voila le code que j'utilise:

<?php

// le répertoire "cache"

$dir_cache = 'cache/';

// nom du fichier mis en cache
$file_cache1 = 'flux1.html';

if (!is_dir($dir_cache)) {
exit ('Répertoire cache "'.$dir_cache.'" inexistant !');
}


// on impose la mise à jour avec une certaine periodicité
$date_modif1 = time();
// le delai entre deux rafraichissements en secondes
$delai1 = 43200;


// le fichier est-il en cache et suffisamment jeune
$file_cache1 = $dir_cache.$file_cache1;
$en_cache1 = file_exists($file_cache1);
if ($en_cache1) {
$en_cache1 = ($date_modif1 < filemtime($file_cache1) + $delai1);
}

if (!$en_cache1) {
// Lecture d'un fichier XML
function lit_xml1($fichier,$item,$champs) {
// on lit le fichier
if($chaine = _AT_implode("",@file($fichier))) {
// on explode sur <item>
$tmp = preg_split("/<\/?".$item.">/",$chaine);


$nombre = sizeof($tmp);

// pour chaque <item>
for($i=1;$i<$nombre -1;$i+=2)
// on lit les champs demandés <champ>
foreach($champs as $champ) {
$tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
// on ajoute au tableau
$tmp3[$i-1][] = @$tmp2[1];
}
// et on retourne le tableau
return $tmp3;
}
}

// Exemple :
$xml1 = lit_xml1("http://monsite.com/xml.php","item",array("title","description","link","category","url"));

foreach($xml1 as $row1) {


$data1 .= '<br><table width=400 height=190 align=center cellpadding=0
cellspacing=0 bgcolor="#F8D630" border=2>';
$data1 .= '<tr>';
$data1 .= '<td colspan=2 height=25 align=center bordercolor=#FFFFCC>
<a href='.$row1[2].'><font color="#000000">'.$row1[0].'</font> </a></td>';
$data1 .= '</tr>';
$data1 .= '<tr>';
$data1 .= '<td bordercolor=#FFFFCC height="136" width="133" valign="middle"
align="center">
<a href='.$row1[2].'><img src='.$row1[4].' border=0></a></td>';
$data1 .= '<td bordercolor=#FFFFCC ><span class="tailledescrip" >
<div style="margin-left:10px;">'.$row1[1].'</div></span></td>';
$data1 .= '</tr>';
$data1 .= '<tr>';
$data1 .= '<td colspan=2 height=25 bordercolor=#FFFFCC><p><em>catégorie :</em> '
.$row1[3].' <em> </td>';
$data1 .= '</tr>';
$data1 .= '</table><br>';


}

$fd1 = fopen($file_cache1, "w");
fputs($fd1, $data1);
fclose($fd1);

} // fin if !$en_cache1

include $file_cache1;
?>

Je ne vois pas trop comment modifier ce code ?

Merci

Posté (modifié)

Salut,

tu appelles une variable debut par exemple, debut=10 (page 2) debut=20 (page3) etc ...

par exemple :

...

$nombre = sizeof($tmp);
$items=10; // nombre d'items voulu
$limite=$debut+1+$items;
if ($nombre<=$items)
{
$debut=0;
$limite=$nombre;
}


// pour chaque <item>
for($i=$debut+1;$i<$limite -1;$i+=2) // on lit les champs demandés <champ>
foreach($champs as $champ) {
$tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]); // on ajoute au tableau
$tmp3[$i-1][] = @$tmp2[1];
}
// et on retourne le tableau
return $tmp3;
}
}

...

Je l'ai pas testé, en fin de journée alors si c'est pas cela, ca s'y rapproche fortement ;)

Modifié par smile
Posté (modifié)

C'est bon j'ai réussi à intégrer un système de pagination sur le parser Xml. J'ai fait plusieurs tests, tout fonctionne correctement.

Cependant j'ai un autre soucis, je viens d'essayer de parser un gros fichier xml ( 10Mo ) et forcément j'ai eu '500 Internal Server Error' , vu qu'avant d'afficher les résultats , je mets toutes les données dans un tableau qui forcément est immense.

A votre avis comment est-ce que je pourrais faire pour ne lire qu'une partie du fichier xml puis afficher , puis lire la suite , puis afficher etc... Je pense que c'est le seul moyen de m'en sortir non ?

Merci

Modifié par seabird

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...