Optimisation eregi

Voilà, j’ai un petit soucis.
Sur un de mes sites, j’ai voulu tester une nouvelle méthode pour que certaines données “statiques” ne poluent plus la bdd.
En gros, je voudrais stockés des articles dans des fichiers textes, jusque là, pas de problème.
En fait, j’ai un fichier texte article.txt et à l’intérieur, ça ressemble à ça :
[fixed][titre]C’est un super exemple[/titre]
[image]images/articles/image.jpg[/image]
[page1]tout plein de texte[/page1][/fixed]

Pour récuperer tout ça, je fais :
[cpp]$tableau = file($recuptxt);
$ligne=array();
while(list($cle,$val) = each($tableau)) {
$art.=$val;
}
// avec, par exemple pour récupérer la valeur du titre :
eregi("[titre](.*)[/titre]",$art,$regs); $titre=htmlspecialchars($regs[1]);
[/cpp]

Mais voilà, à l’affichage, ça ne va pas super vite.
En fait, le fichier texte fait une trentaine de kilo-octets et j’ai une vingtaine de paramètres à récupérer avec les eregi et je suppose donc que chaque eregi() traite donc la totalité de mon fichier texte, donc, je suppose que ça rame à cause de ça.

J’aurais voulu savoir si vous connaissiez un moyen simple d’optimiser ça.

Parce qu’autrement, j’avais lu qu’aller lire un fichier texte sur le hd devait être beaucoup plus rapide que d’aller chercher 30ko d’infos dans MySQL, c’est d’ailleurs le gros avantage de Sqlite, mais l’avantage de ma méthode est que je peux stocker un article par fichier texte contrairement à Sqlite qui me ferait stocker tous mes articles dans le même fichier base de données.

Merci. :smiley:

tu peux tenter un preg_replace_callback :slight_smile:

Beaucoup beaucoup plus puissant :)*

[edit] j’en dirais plus après Ranma 1/2

Bon bah vivement la fin de Ranma 1/2 alors. :smiley:
Merci d’avance. :smiley:

Donc :

chercher un fichier texte dans une BDD ou dans un fichier texte, c’est kifkif. Une BDD c’est … un fichier texte. Avec mySQL (ou n’importe quel SGBDR) tu feras ni plus ni moins que la même chose que prendre les données du fichier.

Sinon, essaye preg_replace_callback.

Ca sera plus performant.

ex:

[cpp]function cb($m) { print_r( $m ); return $m[0]; }
preg_replace_callback(
‘@[(truc)](.*)[/\1]@Usi’,
‘cb’,
$texte
);[/cpp]

Tu pourras faire tout d’une traîte.

(nota: cela ne permettra pas de remplacer des trucs de ce genre :

[foo][bidule][/bidule][/foo] juste [foo]…[/foo].

Je pige pas comment ça marche, j’ai testé, ça fait une demi heure que je suis sur Google, mais je trouve rien que je comprenne. :confused:

Qu’est ce que tu ne comprend pas?

preg_replace_callback et la méthode de callback?
ou preg_replace? ou ma Regexp?

Sinon ce n’est pas la meilleure façon de parser ton document (y en a d’autres).

Bah je suis pas super fort en fonction de recherche/tri/remplacement. :smiley: (pas qu’en ça d’ailleurs)
En fait, je ne comprends pas comment utiliser la fonction que tu donnes pour récupérer par exemple le titre de mon texte qui est stocké dans [titre] et [/titre] dans ma variable $art. (je me doute bien que tu n’as pas utilisé mes noms de variable, mais justement, j’ai modifié ce que je pensais devoir modifier, mais visiblement, j’ai rien compris parce que je n’ai jamais de retour. :s

P.S.: Par contre, si tu connais une meilleur façon de parser un doc, le plus rapidement possible, je suis toute ouïe. :oui: J’ai chercher sur le ouaib, mais je trouve rien de mieux qu’eregi.

preg_replace? :slight_smile:

Au passage, au lieu de ta méthode, utilise soit implode( ‘’, file( ‘truc’ ) ) soit file_get_contents( ‘truc’ ). Ca devrait être moins lent :slight_smile:

ouaip, entre temps, je suis passé au file_get_contents, effectivement.
Mais pour le preg_replace, ça sert à remplacer non ?
Moi ce que je veux, c’est pas un remplacement, c’est juste une lecture du fichier qui me dirait ce qu’il y a entre les balises, par exemple, [titre]super titre[/titre].
$titre=MaSuperFonctionRapideQueJeNeTrouvePas($recupfichier);

:smiley:

Enfin, remarque, ça marche impect avec eregi, mais ça me parait lent à la visu, online, ça passe, mais en local, ça me parait pas super rapide.

Si c’est lent en local, c’est pas normal :o

Sinon petit exemple de preg_*

[cpp]if ( ( $count = preg_match_all( ‘@[titre](.*)[titre]@Usi’, $texte, $match ) ) > 0 )
print_r( $match );[/cpp]

Etc.

Ce sera plus rapide qu’une eregi ?
(Je te demande car si oui, j’ai une trentaine de ligne à modifier, alors je préfère demander avant. :D)

P.S.: Sinon, en local, c’est un serveur Windows (par contre, quand je dis en local, c’est en réseau local mais pas sur mon ordi), c’est peut-être pour ça, cela dit, c’est la première fois que j’ai un temps d’attente.

Ce que je t’ai filé c’est un exemple coco :slight_smile:

Sinon tu devrais essayer xml, au lieu de faire un truc comme ça…

+1 pour xml…

+2 pour mettre tout en base donnée avec des champs voir des tables differente pour chaque partie de doc

conclusion : +3 xml en base donnée :slight_smile:

ps : c pas exactement pareil de chercher dans un fichier que dans une base because le sgbdr essaye d’optimiser les acces de maniere global (cad dir dans ton cas pour plusieurs articles …) du coup un article fortement solicité risque d’etre en memoire vive…

remarque avec certaine os, le fichier aussi peut etre en memoire vive :slight_smile:

la gestion de l’acces a la donnée sera quand meme meilleur dans une base ! (index, index full text, etc)

Sous Windows, le fichier est en RAM (s’il fait moins de la taille d’un bloc). Idem que quazardous sur la BDD.

a marquer d’une pierre blanche : pour une fois que je tombe d’accord avec sans-nom :wink:

bon week !

tss! :stuck_out_tongue:

Bon, j’ai trouvé un système qui relève de l’instantanée et qui arrange tout le monde.
J’ai fait un fichier article-0.txt avec les params et un article-x.txt par page.

Niveau BDD, j’imagine bien qu’elles sont gérés dans des fichiers puisque je fais la sauvegarde direct de ses fichiers régulièrement, mais elles évitent l’appel au serveur de base de données et vu qu’on peut lire partout que le principal avantage de sqlite sur MySQL c’est justement qu’elle n’oblige pas l’accès à un serveur de BDD mais juste un accès à un fichier, l’accès direct doit être plus rapide.

En tout cas, là c’est bon, avec ma méthode, je fais juste un file_get sur mes paramètres et sur la page à afficher et on retombe dans l’instantanée, je m’en sors bien et je me rends compte que même au niveau de l’édition d’une seule page, c’est plus simple, c’est tout bénef, je vous remercie de vos conseils.

P.S.: Le preg marchait très mal parce qu’il m’obligeait à passer d’abord par un nl2br().

ben c un avantage et un inconvenient

sqlite c rapide pour de petite table…

pour une grosse base avec des index de recherche fulltext (par exemple quels sont les article qui contiennent le mot sport…) ça va etre pas terrible…

en plus question scalabilité avec un serveur de bd on peut dissocier les serveur apache et le serveur de base…

donc sqlite oui mais pas systematiquement