interpreter une chaine à la volée ? - PHP - Programmation
Marsh Posté le 06-12-2005 à 19:35:19
j'explique mon problème au cas où il y aurait une autre solution:
Le but est de mettre un fichier.php en cache après l'avoir transformé (avec transformation()) ET d'envoyer le résultat au navigateur.
La mise en cache ne se fait pas à chaque fois mais la transformation oui (mais je ne veux pas transformer le fichier.php en lui même).
Code :
|
Marsh Posté le 06-12-2005 à 19:41:08
Code :
|
Marsh Posté le 06-12-2005 à 21:13:41
J'ai rien compris, mais ptete que http://www.php.net/eval pourrait aider.
Marsh Posté le 06-12-2005 à 22:12:47
fichier.php
|
cachecache.php
Code :
|
eval() fait prèsque ce que je veux. Le problème, c'est qu'il fait un éval sur la $string et considère donc tout comme du code php. or là, j'ai un mix (code php et code html) et eval ne fait pas la différence (erreur sur <?)
En gros, ce que je voudrais faire c'est :
cachecache.php
Code :
|
seulement, comme je ne crée pas cache.php à tous les coups, je ne peux pas faire ca...
j'espère que c'est mieux expliqué
Marsh Posté le 06-12-2005 à 22:22:25
Hum, tu caches du PHP là
Marsh Posté le 06-12-2005 à 22:26:30
oui, derrière l'éléphant rose
en fait c'est parce que parfois j'ai besoin d'afficher un message d'erreur ou quelque chose, donc j'ai une page "cache" avec dedans un <? if($erreur) echo "pas bien" ?>
par exemple une page news avec euh... des news. Toutes le news sont mises en cache (donc plus besoin d'accès db), mais s'il y a une erreur à l'insertion d'une nouvelle news, j'affiche l'erreur.
c'est mal ?
Marsh Posté le 06-12-2005 à 22:28:35
Ben normalement on cache le fichier final justement pour pouvoir le balancer direct sans faire de réinterprétations quoi
Et j'vois pas pourquoi tu mettrais un message à tes utilisateurs quand t'as une merde quand t'insères une news, ils s'en foutent eux
Marsh Posté le 06-12-2005 à 23:04:46
en fait je construis mes pages comme ca:
1. je construis layout.php : layout.xml + layout.xsl. (donc un "cache" du layout)
2. layout.php contient <? include ($module); ?>
3. un module est soit
Donc pour éviter de devoir refabriquer mon fichier (DB-> XML + XSL), je "cache" le résultat de cette "fabrication".
Seulement, sur certaines pages, il faut afficher telles infos pour les membres, telles autres pour les admins, des infos personnalisées, ...
donc, je me fabrique une sorte de langage (c'est un bien grand mot mais bon) qui lors de ma "fabrication de pages" m'ajoute du php pour gérer ces différents cas.
mon cache me sert donc à avoir les infos dispos, formatées comme il faut.
Après, je gère suivant les cas (rang de l'utilisateur, données personnalisées, ...)
je suis tout ouï pour les critiques que vous pourriez émettre
Marsh Posté le 07-12-2005 à 01:47:42
!j'ai rien compris, mais si tu distingues le traitement de l'affichage t'auras pas besoin de ta bidouille
Il te faut un espèce de sytème de templates apparement vu comme t'abordes la chose, vois du côté de preg_match & co
Marsh Posté le 07-12-2005 à 02:06:45
art_dupond a écrit : donc, je me fabrique une sorte de langage (c'est un bien grand mot mais bon) qui lors de ma "fabrication de pages" m'ajoute du php pour gérer ces différents cas. |
Moi, c'est ça que j'ai pas compris.
J'ai encore moins compris en quoi ça t'oblige à interpréter du code PHP se trouvant dans une chaîne.
Marsh Posté le 07-12-2005 à 02:42:07
alala...
j'ai un template de ma page dans un fichier xsl.
layout.xsl
Code :
|
voir lignes: 8,14,18,24
le fichier layout.xml:
Code :
|
contient un "main_menu" et un "admin_menu"
J'applique le xsl sur le xml et je transforme avec preg_replace()
Code :
|
et j'obtiens un fichier que je nomme layout.php
Quand on demande une page (tout ce fait depuis index.php), j'inclus layout.php qui lui même incluera la page demandée ($page).
On voit qu'il y a deux menus: un menu "normal" et un menu "admin" (dans layout.xml).
Avec ce système, je peux afficher le menu admin en mettant dans index.php
index.php
Code :
|
d'accord, ce n'est pas un vrai cache statique, mais ca ne marche pas trop mal.
Maintenant les problèmes (interprétation du code de la chaine) :
la page incluse ($page) peut elle-même contenir des <mon_if> ou <mon_include>
Pour transformer ces pages, je les mets dans le buffer que je récupère sous forme de chaine, chaine que je transforme
Code :
|
A la ligne 15, j'ai donc une chaine que je dois envoyer au navigateur, mais pas brut comme ca puisqu'elle contient des <? if... ?>
Il me faut donc interpréter $buffer;
vous avez compris ou il faut que je fasse caca aussi
Marsh Posté le 07-12-2005 à 02:48:57
interprêter du php c'est eval comme quelqu'un t'as dit plus haut
A voir que tu peux utiliser un callback avec preg_replace_callback Et y faire tes évaluations de code php par exemple
Marsh Posté le 07-12-2005 à 02:54:14
Ton imagination est sans limite.
[SI J'AI BIEN COMPRIS :]
Tu devrais plutôt modifier ton layout.xml en fonction de l'utilisateur et ensuite appliquer le XSL qui habillera lui même les éventuels champs optionnels. Ca serait en tout cas bc plus propre, parce que là ton preg_replace sur le résultat d'une transformation XSL...
Marsh Posté le 07-12-2005 à 02:55:24
oui mais non, ca ne va pas le preg_replace_callback
enfin je ne vois pas comment ca pourrait marcher.
exemple:
Code :
|
donc si je fais
Code :
|
donnera
Citation : <span> bonjout toto</span> |
Code :
|
donnera
<span> j'ai faim </span>[/quote]
Marsh Posté le 07-12-2005 à 02:57:44
kalex a écrit : Ton imagination est sans limite. |
oui mais mon preg_replace, je ne le fais qu'une fois pour créer layout.php (une sorte de cache). c'est donc plus léger que de refaire la transfo xml+xsl suivant les users...
je sais bien que je peux appliquer un xsl spécifique à chaque user, mais par expemple, si la page appelée veut un titre particulier pour la page, ben il faudra réappliquer le xsl.
Donc là, je me fais la transformation une fois et après, la page réagit en fonction des paramètres demandés
ps:
Citation : Ton imagination est sans limite. |
il est très bien mon système
Marsh Posté le 07-12-2005 à 03:13:23
Ben franchement, je viens de relire ton explication, c'est affreux ce système !
Avec ce raisonnement tu vas arriver à deux versions de toutes tes fonctions, l'une dans le cache, l'autre dans le vrai moteur du site.
Si tu veux un cache efficace, suit ce conseil simple : JAMAIS de code exécutable dans le cache.
edit : je parle là du fichier que tu crées en vue de "cacher" les données de la bdd.
Marsh Posté le 07-12-2005 à 03:19:05
la plupart du temps, il n'y aura bien aucun code php dans ces pages "cachées".
mais il peut arriver par exemple que j'ai besoin du nom de l'utilisateur en ligne dans une de ces pages.
j'aurai donc un <? echo $login; ?> dans ce "cache"
comment faire avec un "vrai" cache
je ne vais quand meme pas reconstruire toute la page pour rajouter le login...
et je ne vais pas ne pas faire de cache juste parce que je dois faire un echo dedans...
edit: il n'y aura qu'une version de mes fonctions:
index.php
Code :
|
layout.php
Code :
|
faux_cache.php
Code :
|
où est le problème ?
Marsh Posté le 07-12-2005 à 03:33:04
Ce qui me vient à l'esprit, c'est plutot ce genre de shema :
Il me paraît clair que c'est au système de cache de gérer l'ajout et non aux fichiers "cachés".
Marsh Posté le 07-12-2005 à 03:41:34
c'est peut-etre "mieux", mais c'est plus léger comme je fais non (ca évite des tas de traitements pour afficher un pauvre truc: j'inclus la page et basta) ?
En plus ca marche plutot bien, le seul problème étant le fait d'être obligé de mettre en cache pour que ca marche... (puisque quand le fichier "cache" est inclus, il est interprèté).
Q: Pourquoi alors ne pas inclure une page php normale (sans <mon_if>, ...) quand je ne veux pas mettre en cache ?
A: parce que je veux pouvoir mettre en cache ou non dynamiquement suivant la fréquence de modification d'une page... (pour plus tard mais je prévois)
Marsh Posté le 07-12-2005 à 03:54:30
Pour la rapidité, tout dépend de la façon de faire, de ce que tu mets dans ton cache, de la méthode utilisée...
Mais je pense que ça peut être tout aussi rapide.
Bonne nuit.
Marsh Posté le 07-12-2005 à 03:59:21
art_dupond a écrit : oui mais non, ca ne va pas le preg_replace_callback
|
Oui donc? Il est où le problème, tu réinvente les concepts de base là
Marsh Posté le 07-12-2005 à 04:00:37
En fait si tu fais du php tu fais un echo, tu peux pas mêler php et html comme ça comme tu veux
Marsh Posté le 07-12-2005 à 04:27:35
insomnie powaaaa
suis crevé
leflos5 a écrit : Oui donc? Il est où le problème, tu réinvente les concepts de base là |
ben le problème c'est que je ne vois pas ce que viendrait faire preg_replace_callback() dans le bazar
leflos5 a écrit : En fait si tu fais du php tu fais un echo, tu peux pas mêler php et html comme ça comme tu veux |
c'est bien ca mon problème
en résumé, ce que je voudrais faire :
Code :
|
mais sans créer le fichier temp.php
Marsh Posté le 07-12-2005 à 04:31:36
kalex a écrit : Pour la rapidité, tout dépend de la façon de faire, de ce que tu mets dans ton cache, de la méthode utilisée... |
merci
mettons que j'ai un fichier cache.html
si je dois y placer $login
je ferais un truc du genre
Code :
|
mais je trouve ca un peu lourd...
tu ferais comment ?
mmmm doit y avoir des fonctions de manipulation de fichier qui faciliteraient les choses... je vais me pencher dessus
par contre, pour mes IF, je ne vois pas comment faire, à part un fichier pour chaque cas...
Marsh Posté le 07-12-2005 à 15:07:33
art_dupond a écrit : merci
|
C'est l'une des manières de faire une template. Et je pense que c'est plus rapide de remplacer une simple occurrence que de parser tout un fichier contenant du code PHP autrement plus complexe que "{login}"...
Marsh Posté le 07-12-2005 à 16:03:27
oui mais
je ne parse qu'UNE seule fois: lors de la mise en cache (je ne sais pas pourquoi mais je n'arrive pas à faire passer ce message ).
avec un système de template classique, on doit remplacer {login} à chaque appel de la page, et donc parser à chaque appel (oui bon, on peut aussi mettre en cache...).
chez moi, il y a un <? echo $login; ?> donc, il n'y a plus rien à faire (enfin si, php doit quand meme parser la page mais ce n'est quand meme pas plus pire que de chercher {login} dans la page et le remplacer. Je dirais même que c'est plus rapide )
Marsh Posté le 07-12-2005 à 16:33:25
Si j'ai bien compris !
Mais je ne vois pas en quoi ça serait plus rapide d'exécuter une chaîne contenant du code PHP que d'y remplacer 2/3 occurrences.
Marsh Posté le 07-12-2005 à 22:28:12
ben c'est déjà pas moins rapide.
puis ca me permet un peu de souplesse dans mon cache.
Par exemple si j'ai un "module" qui affiche des produits, et que je veux que ce module apparaisse sur plusieurs pages, il me suffit de mettre
Code :
|
dans ces pages et ca roule.
c'est presque comme un vrai cache sauf qu'il y a 3 includes() (un pour inclure le layout, un pour inclure la page demandée et un pour inclure le module.) En dehors de ca, pas de php.
Bon un include coûte un peu, mais ce n'est pas significatif et le système est simple à l'emploi et me convient donc je suis content
enfin bon, je crois qu'on a chacun notre avis donc voilà
et sinon, pour mon problème ?
Marsh Posté le 09-12-2005 à 03:47:25
question con car j'ai un doute :
c'est bien IE ou firefox qui applique la feuille de style xsl sur le poste du client, donc après pour évaluer du php qui y serait inclus, faudrait que le client rebalance la page au site (sous forme de formulaire avec un submit auto ? gnin ?) pour que le site la renvoie encore, corrigée ...
bref si j'ai raison, ce que tu veux faire n'est pas possible à ce moment-là
Marsh Posté le 09-12-2005 à 15:00:56
TheRom_S a écrit : question con car j'ai un doute : |
non, j'applique le xsl sur le xml côté serveur
Marsh Posté le 15-12-2005 à 15:44:24
art_dupond a écrit : |
1- Pourquoi ne pas passer les variables aux feuilles xslt ?
2- Pourquoi ne pas récuperer l'état de différente variable en appelant une fonction php depuis une feuille xslt ?
Marsh Posté le 15-12-2005 à 15:51:48
include $include;
sa roule; pas ? j'ai pas trop saisie là
Edit ok j'ai rien je vais de comprendre le truc
Marsh Posté le 15-12-2005 à 15:57:31
art_dupond a écrit : oui mais
|
normal parce que tu as <? ... ?> il te faut un interpreteur d'un niveau plus haut.
Marsh Posté le 15-12-2005 à 16:11:13
zapan666 a écrit : 1- Pourquoi ne pas passer les variables aux feuilles xslt ? |
parce que je ne veux pas devoir appliquer le xslt (appliqué coté serveur) à chaque appel de mes pages.
Marsh Posté le 06-12-2005 à 19:21:54
youp,
existe-t-il une fonction pour faire une sorte d'include mais avec une chaine.
exemple: include ('<? echo "oui"; ?>');
merci
Message édité par art_dupond le 06-12-2005 à 19:43:14
---------------
oui oui