Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[IE] Gestion du "cache" pour des fichiers php

5 réponses
Avatar
Eric Leconte
dernierement, j'ai un souci de "raffraichissement" du code des pahes php
uploadé sur mon server perso.

-------------------
$DBerr = openDatabase();

if ($DBErr) echo 'erreur';

if (getTBLGeneralValue('maintenance', $value))
{ $value = '1'; if ($value == '1')
{ header('location:'.cstHomedir.$path); exit; } }

echo 'index';
exit;
-----------------------------

le code simple ci dessus dans "index.php" me pose des soucis.
Il se trouve en entete de fichier.
Il est sense effectuer une lecture dans la Base de donnee et detecter la
presence d'une valeure "maintenance" pour rediriger vers la page de
maintenance ou bien afficher le reste de la page index qui gere les
connections au site.

LA fonction "openDatabase" effectue l'ouverture de la base et la
connection a mysql.
La fonction "getTBLGeneralValue" effectue une requete sql sur la base et
renvoie dans "value" la valeur desire.
PS : la table en question possede 2 entree : "key" et "value".

Mon soucis : quelque qoit le retour de la requere (ie $value) je n'ai pas
le resultat escompte.
J'ai teste aussi en "forcant" l'affectation de la variable a "1" ou "0"
(code encore present dans l'extrait).

Je modifie ma valeure soit dans la base soit dans l'affectation forcee,
J'upload mon fichier sur le server (via Dreamweaver)
Je vais sur mon navigateur, je fais "F5" pour raffraichir ou bien je
clique dans la barre d'adresse puis sur entrer pour recharger la page avec
(normalement) les modifications.
Je ne vois rien. C'ets en general la meme page qui s'affiche.

Ca marche pourtant un moment mais au bout de 2 ou 3 fois ca boucle sur la
meme page quelque soit la valeur.

Je precise que je suis actuelement sous IE, avec un cache fichier a 1Mo
(minimum possible ... si je pouvais 0 je le ferais), et j'ai specifié de
ne famais faire appel au cache.

Une idee ?
Merci !!

5 réponses

Avatar
Olivier Miakinen

dernierement, j'ai un souci de "raffraichissement" du code des pahes php
uploadé sur mon server perso.

-------------------
$DBerr = openDatabase();

if ($DBErr) echo 'erreur';

if (getTBLGeneralValue('maintenance', $value))
{ $value = '1'; if ($value == '1')
{ header('location:'.cstHomedir.$path); exit; } }


J'ai plein de remarques sur ce code.
1) Est-ce la fonction getTBLGeneralValue() qui initialise la variable
$value par référence ?
2) Pourquoi positionner $value à 1 juste avant de quitter le code en
rendant la main au navigateur à qui tu demandes de faire une
nouvelle requête ?
3) Pourquoi tester ($value == '1') puisque ce test sera forcément vrai ?
4) Que vaut la constante cstHomedir ?
5) Sais-tu que si cstHomedir pointe sur le même site il est parfaitement
stupide de faire faire un aller et retour au lieu d'utiliser la
fonction require() ? Ceci est encore plus vrai si cstHomedir ne
commence pas par « http:// » ou « https:// » car cela enfreint les
règles des redirections.
6) As-tu lu la FAQ ?
http://faqfclphp.free.fr/#rub2.11
http://faqfclphp.free.fr/#rub2.12

[...]
La fonction "getTBLGeneralValue" effectue une requete sql sur la base et
renvoie dans "value" la valeur desire.


Bon, ceci répond à l'une de mes questions. Et que retourne-t-elle à
l'appelant lors du « return » ? 1 si tu as une valeur "maintenance"
et 0 sinon ?

Mon soucis : quelque qoit le retour de la requere (ie $value) je n'ai pas
le resultat escompte.


Vérifier le code de retour principal (testé par le premier if).

J'ai teste aussi en "forcant" l'affectation de la variable a "1" ou "0"
(code encore present dans l'extrait).


Ah, OK. Ça me semblait bizarre aussi.

Une idee ?


Deux principalement :
- vérifier le code de retour de la fonction (*pas* $value) ;
- remplacer header() par require() (lire la FAQ).

Avatar
Eric Leconte
Je vais quand meme repondre a tes premieres questions ... car meme si le
pb semble resolu, cela m'aidera a comprendre peut etre certains aspects du
php.


Le Mon, 09 Oct 2006 15:08:32 +0200, Olivier Miakinen
<om+ a écrit:


dernierement, j'ai un souci de "raffraichissement" du code des pahes php
uploadé sur mon server perso.

-------------------
$DBerr = openDatabase();

if ($DBErr) echo 'erreur';

if (getTBLGeneralValue('maintenance', $value))
{ $value = '1'; if ($value == '1')
{ header('location:'.cstHomedir.$path); exit; } }


J'ai plein de remarques sur ce code.
1) Est-ce la fonction getTBLGeneralValue() qui initialise la variable
$value par référence ?


Oui comme dit plus bas, c'est une astuce que j'utilise souvent dans mes
programes binaires quand j'ai besoin de plusieurs valeurs de retours.
En fait j'utilise plus souvent des structures mais la je sais pas les
mettre en place :)

2) Pourquoi positionner $value à 1 juste avant de quitter le code en
rendant la main au navigateur à qui tu demandes de faire une
nouvelle requête ?


On l'a vu plus bas : pour "forcer" le test. cela me sert aussi a eviter de
mettre a jour ma BdD pour tester ma page, vu que je ne sais pas pourquoi
mais mon server phpmyadmin est tres lent. (enfin si je me doute : un PI
166 avec 23mo de ram .... ca n'aide pas.)

3) Pourquoi tester ($value == '1') puisque ce test sera forcément vrai ?


ben crois moi ou non .... meme avec mon code ca m'affiche quand meme le
resultat "faux" ;)

4) Que vaut la constante cstHomedir ?


elle est le chemin relatif jusqu'a la racine du site. C'ets a dire ".",
"..", "../..", etc ...
C'est la seule astuce que j'ai trouve pour specifier des chemin absolu
depuis la racine du site tout en gerant la partie variable de celui ci.
Je m'explique. Chez moi j'ai un server web perso : http://XXXX.YY.ZZ/
dans lequel j'ai un repertoire par site :
http://XXXX.YY.ZZ/Monsite1
http://XXXX.YY.ZZ/Monsite2

PAr contre j'envisage de passer un jour sur un site dedié (genre pages
perso free). dans ce cas l'adresse racine du site sera : http://XXXX.YY.ZZ/

Donc les chemin relatifs passerons de /Monsite1/Pages a /Pages par exemple
....
Je ne sais pas si tu suis mais cette methode me permet d'avoir :
../../Pages comme chemin.

De plus cela palie le fait que je ne sais jamais depuis quelle page est
inclu le script .....

5) Sais-tu que si cstHomedir pointe sur le même site il est parfaitement
stupide de faire faire un aller et retour au lieu d'utiliser la
fonction require() ? Ceci est encore plus vrai si cstHomedir ne
commence pas par « http:// » ou « https:// » car cela enfreint les
règles des redirections.


j'utilise la plupart du temps require_once mais c'ets visiblement la meme.
Je ne comprends pas ton histoire d'aller retour.

6) As-tu lu la FAQ ?
http://faqfclphp.free.fr/#rub2.11
http://faqfclphp.free.fr/#rub2.12


Peut etre pas la faq .... mais a peut pres une bonne 40 aines de sites
differents ;)
J'irais faire un tour.


[...]
La fonction "getTBLGeneralValue" effectue une requete sql sur la base et
renvoie dans "value" la valeur desire.


Bon, ceci répond à l'une de mes questions. Et que retourne-t-elle à
l'appelant lors du « return » ? 1 si tu as une valeur "maintenance"
et 0 sinon ?

Mon soucis : quelque qoit le retour de la requere (ie $value) je n'ai
pas
le resultat escompte.


Vérifier le code de retour principal (testé par le premier if).

J'ai teste aussi en "forcant" l'affectation de la variable a "1" ou "0"
(code encore present dans l'extrait).


Ah, OK. Ça me semblait bizarre aussi.

Une idee ?


Deux principalement :
- vérifier le code de retour de la fonction (*pas* $value) ;
- remplacer header() par require() (lire la FAQ).



Avatar
Olivier Miakinen

Je vais quand meme repondre a tes premieres questions ... car meme si le
pb semble resolu, cela m'aidera a comprendre peut etre certains aspects du
php.


C'est avec plaisir que je tâcherai de t'aider à y voir plus clair.

if (getTBLGeneralValue('maintenance', $value))
{ $value = '1'; if ($value == '1')
{ header('location:'.cstHomedir.$path); exit; } }


J'ai plein de remarques sur ce code.
1) Est-ce la fonction getTBLGeneralValue() qui initialise la variable
$value par référence ?


Oui comme dit plus bas, c'est une astuce que j'utilise souvent dans mes
programes binaires quand j'ai besoin de plusieurs valeurs de retours.
En fait j'utilise plus souvent des structures mais la je sais pas les
mettre en place :)


Une autre possibilité consiste à retourner un tableau :
return array($valeur1, $valeur2, $valeur3);

Lors de l'appel, tu peux extraire le contenu directement avec la
construction list :
list($val1, $mal2, $val3) = mafonction();

Voir <http://fr2.php.net/list>.

2) Pourquoi positionner $value à 1 juste avant de quitter le code en
rendant la main au navigateur à qui tu demandes de faire une
nouvelle requête ?


On l'a vu plus bas : pour "forcer" le test.


Ça ne force rien du tout, puisque tu as un premier test sur la valeur de
retour de la fonction.

Petit rappel de ton code, en l'indentant pour le rendre plus clair :

if (getTBLGeneralValue('maintenance', $value)) {
$value = '1';
if ($value == '1') {
header('location:'.cstHomedir.$path);
exit;
}
}
echo 'index';
exit;

Si ta fonction getTBLGeneralValue() se termine par un return(1) ou
n'importe quoi d'autre qui n'est pas nul, alors quelle que soit la
valeur de $value retournée par la fonction, tu forces $value à 1,
puis tu réponds au navigateur avec un code 3xx, en abandonnant donc le
script en cours (ce qui détruit la variable $value).

Inversement, si ta fonction getTBLGeneralValue() se termine par un
return(0) ou n'importe quoi d'autre qui soit nul, alors quelle que soit
la valeur de $value retournée par la fonction, tu fais echo 'index' et
tu sors.

Dans un cas comme dans l'autre, tu n'utilises pas le $value calculé par
la fonction.

3) Pourquoi tester ($value == '1') puisque ce test sera forcément vrai ?


ben crois moi ou non .... meme avec mon code ca m'affiche quand meme le
resultat "faux" ;)


Attention : je voulais dire « ce test sera forcément vrai dans le cas où
tu passes dedans ». Dans le cas où tu passes par echo 'index', le test
($value == '1') n'est pas vu.

4) Que vaut la constante cstHomedir ?


elle est le chemin relatif jusqu'a la racine du site. C'ets a dire ".",
"..", "../..", etc ...


C'est parfait pour un require(), mais interdit pour une redirection HTTP
(même si la plupart des navigateurs l'acceptent).

C'est la seule astuce que j'ai trouve pour specifier des chemin absolu
depuis la racine du site tout en gerant la partie variable de celui ci.
Je m'explique. Chez moi j'ai un server web perso : http://XXXX.YY.ZZ/
dans lequel j'ai un repertoire par site :
http://XXXX.YY.ZZ/Monsite1
http://XXXX.YY.ZZ/Monsite2


Pas de problème pour un require()

PAr contre j'envisage de passer un jour sur un site dedié (genre pages
perso free). dans ce cas l'adresse racine du site sera : http://XXXX.YY.ZZ/


Dans ce cas, pour passer d'un site à l'autre, une redirection par
header() peut être obligatoire. Mais cela ne doit pas se faire très
souvent, et jamais dans une navigation courante.

Donc les chemin relatifs passerons de /Monsite1/Pages a /Pages par exemple


Ah. Et ça ne passera pas de http://site1/Pages à http://site2/Pages ?
Pas de header("Location"), donc.

5) Sais-tu que si cstHomedir pointe sur le même site il est parfaitement
stupide de faire faire un aller et retour au lieu d'utiliser la
fonction require() ? Ceci est encore plus vrai si cstHomedir ne
commence pas par « http:// » ou « https:// » car cela enfreint les
règles des redirections.


j'utilise la plupart du temps require_once mais c'ets visiblement la meme.


Absolument pas. Il y a un monde entre les deux. Tu connais l'histoire du
livreur de machine à laver (ou de frigo, je ne sais jamais) ?

Je ne comprends pas ton histoire d'aller retour.


Ce serait bien que tu la comprennes, parce que cela pourrait expliquer
la lenteur de ton site *beaucoup mieux* que par le type de CPU.

6) As-tu lu la FAQ ?
http://faqfclphp.free.fr/#rub2.11
http://faqfclphp.free.fr/#rub2.12


Peut etre pas la faq .... mais a peut pres une bonne 40 aines de sites
differents ;)
J'irais faire un tour.


Je ne te demande pas de lire toute la FAQ (enfin... si, c'est toujours
intéressant, mais pas pour ton problème particulier) mais juste de lire
les deux paragraphes dont j'ai donné les liens ci-dessus.

[...]
La fonction "getTBLGeneralValue" effectue une requete sql sur la base et
renvoie dans "value" la valeur desire.


Bon, ceci répond à l'une de mes questions. Et que retourne-t-elle à
l'appelant lors du « return » ? 1 si tu as une valeur "maintenance"
et 0 sinon ?

Mon soucis : quelque qoit le retour de la requere (ie $value) je n'ai
pas
le resultat escompte.




Je le dis et le répète : le $value, ton code s'en fiche comme de l'an
40, à cause du if devant getTBLGeneralValue().

Vérifier le code de retour principal (testé par le premier if).



Tiens, je l'avais déjà écrit, mais tu n'as pas eu l'air de trouver ça
important car tu n'y as pas répondu.

Une idee ?


Deux principalement :
- vérifier le code de retour de la fonction (*pas* $value) ;



Ah ben oui, je l'ai même écrit plus d'une fois.

- remplacer header() par require() (lire la FAQ).



D'habitude je râle quand on cite des choses auxquelles on ne répond pas,
mais là ça me permet d'insister dessus... ;-)

--
Olivier Miakinen



Avatar
Olivier Miakinen
Histoire de mettre les points sur les i :


Petit rappel de ton code, en l'indentant pour le rendre plus clair :

if (getTBLGeneralValue('maintenance', $value)) {
$value = '1';
if ($value == '1') {
header('location:'.cstHomedir.$path);
exit;
}
}
echo 'index';
exit;


Ce code est équivalent à :

if (getTBLGeneralValue('maintenance', $value)) {
$value = '1';
header('location:'.cstHomedir.$path);
exit;
}
echo 'index';
exit;

soit :

if (getTBLGeneralValue('maintenance', $value)) {
$value = '1';
header('location:'.cstHomedir.$path);
exit;
} else {
echo 'index';
exit;
}

ou encore :

if (getTBLGeneralValue('maintenance', $value)) {
header('location:'.cstHomedir.$path);
exit;
} else {
echo 'index';
exit;
}

et finalement :

if (getTBLGeneralValue('maintenance', $value)) {
header('location:'.cstHomedir.$path);
} else {
echo 'index';
}
exit;

Ça te parle mieux comme ça ?

Avatar
Eric Leconte
Le Tue, 10 Oct 2006 02:34:40 +0200, Olivier Miakinen
<om+ a écrit:


Je vais quand meme repondre a tes premieres questions ... car meme si le
pb semble resolu, cela m'aidera a comprendre peut etre certains aspects
du
php.


C'est avec plaisir que je tâcherai de t'aider à y voir plus clair.



Merci :)

if (getTBLGeneralValue('maintenance', $value))
{ $value = '1'; if ($value == '1')
{ header('location:'.cstHomedir.$path); exit; } }


J'ai plein de remarques sur ce code.
1) Est-ce la fonction getTBLGeneralValue() qui initialise la variable
$value par référence ?


Oui comme dit plus bas, c'est une astuce que j'utilise souvent dans mes
programes binaires quand j'ai besoin de plusieurs valeurs de retours.
En fait j'utilise plus souvent des structures mais la je sais pas les
mettre en place :)


Une autre possibilité consiste à retourner un tableau :
return array($valeur1, $valeur2, $valeur3);

Lors de l'appel, tu peux extraire le contenu directement avec la
construction list :
list($val1, $mal2, $val3) = mafonction();

Voir <http://fr2.php.net/list>.


Ca c'est pas idiot du tout ... c'est vrai qu'avec cette histoire de
tableaux associatifs, on peut gerer d'une certaine maniere des structures
... Je comprends ce que tu veux dire.


2) Pourquoi positionner $value à 1 juste avant de quitter le code en
rendant la main au navigateur à qui tu demandes de faire une
nouvelle requête ?


On l'a vu plus bas : pour "forcer" le test.


Ça ne force rien du tout, puisque tu as un premier test sur la valeur de
retour de la fonction.

Petit rappel de ton code, en l'indentant pour le rendre plus clair :

if (getTBLGeneralValue('maintenance', $value)) {
$value = '1';
if ($value == '1') {
header('location:'.cstHomedir.$path);
exit;
}
}
echo 'index';
exit;


Effectivement j'ai pas pense a cela. Ca doit etre parceque je ne suis pas
dans mon element habituel ... j'ai les reflexes enbrumé ;)

PAr contre, le premier test est quand meme sensé etre "vrai" vu qu'en
retour de fonction je renvoie true ou false en fonction des erreurs mysql
renvoyées. Autrement dit, getTBLGeneralValue renvoie le succes de la
requete et non la valeur de la clef .... En theorie, si ma table et ma
requette est correcte, il est tout le temps vrai.

Cela renvoie a une autre question : Comment gerer les erreurs mysql ? j'ai
noté que chaques erreurs meme me genere un texte d'erreur dans ma page
php. MEs tests "if (!res)" semble ne pas marcher. (ie pour mail()).


Si ta fonction getTBLGeneralValue() se termine par un return(1) ou
n'importe quoi d'autre qui n'est pas nul, alors quelle que soit la
valeur de $value retournée par la fonction, tu forces $value à 1,
puis tu réponds au navigateur avec un code 3xx, en abandonnant donc le
script en cours (ce qui détruit la variable $value).

Inversement, si ta fonction getTBLGeneralValue() se termine par un
return(0) ou n'importe quoi d'autre qui soit nul, alors quelle que soit
la valeur de $value retournée par la fonction, tu fais echo 'index' et
tu sors.


Oui a priori c'est ce que je souhaitais.


Dans un cas comme dans l'autre, tu n'utilises pas le $value calculé par
la fonction.



Effectivement, mais la presence de ce "1" est pour forcer le test au cas
ou ma fonction get plantais et me renvoyais n'importe quoi. De plus elle
me permet de tester les valeurs de la BdD possible sans avoir a la
modifier.

3) Pourquoi tester ($value == '1') puisque ce test sera forcément vrai
?


ben crois moi ou non .... meme avec mon code ca m'affiche quand meme le
resultat "faux" ;)


Attention : je voulais dire « ce test sera forcément vrai dans le cas où
tu passes dedans ». Dans le cas où tu passes par echo 'index', le test
($value == '1') n'est pas vu.


4) Que vaut la constante cstHomedir ?


elle est le chemin relatif jusqu'a la racine du site. C'ets a dire ".",
"..", "../..", etc ...


C'est parfait pour un require(), mais interdit pour une redirection HTTP
(même si la plupart des navigateurs l'acceptent).



Ha ? et que faut il dans un header ?
Je l'utilise actuelement comme ca ...

C'est la seule astuce que j'ai trouve pour specifier des chemin absolu
depuis la racine du site tout en gerant la partie variable de celui ci.
Je m'explique. Chez moi j'ai un server web perso : http://XXXX.YY.ZZ/
dans lequel j'ai un repertoire par site :
http://XXXX.YY.ZZ/Monsite1
http://XXXX.YY.ZZ/Monsite2


Pas de problème pour un require()

PAr contre j'envisage de passer un jour sur un site dedié (genre pages
perso free). dans ce cas l'adresse racine du site sera :
http://XXXX.YY.ZZ/


Dans ce cas, pour passer d'un site à l'autre, une redirection par
header() peut être obligatoire. Mais cela ne doit pas se faire très
souvent, et jamais dans une navigation courante.


Non, je voulais dire : transferer mon site sur un espace page perso ...
dont la structure sera differente.
Mon serveur web heberge plusieurs sites persos donc l'adresse du site en
question est : <Adresse serverweb>/<nom du site> au lieu de <adresse
serverweb> tout court.
MEs chemins relatifs a la racine du site doivent dans un cas inclure "<nom
du site>" et dans l'autre cas non. D'ou un probleme sur la generation des
chemins.


Donc les chemin relatifs passerons de /Monsite1/Pages a /Pages par
exemple


Ah. Et ça ne passera pas de http://site1/Pages à http://site2/Pages ?
Pas de header("Location"), donc.


Ha bon ..... mais comment je fait pour passer d'une page a l'autre ?
En fait, je suis encore un peu perdu dans ce domaine la.
Ce que je souhaite c'est de faire la meme chose que des liens hypertexte.
Si je clique sur un lien, je change de page (l'url esst differente), donc
apres avoir bouclé sur la page php afin de tester les variables du
formulaire choisi, si les conditions sont reunie, je traite les variables
et je "redirige" sur la page adequoite.
PAr exemple la page "index" qui sert d'identification. une fois validée,
je redirige sur "home".
Si je fait un "require", j'inclut le contenu de "home.php" dans
"index.php" ce qui fait que dans la barre j'ai toujours "index.php".
Pour moi ca ne correspond pas a la vision que je me faisait des sites web
.. mais peut etre que je me trompe ....


5) Sais-tu que si cstHomedir pointe sur le même site il est
parfaitement
stupide de faire faire un aller et retour au lieu d'utiliser la
fonction require() ? Ceci est encore plus vrai si cstHomedir ne
commence pas par « http:// » ou « https:// » car cela enfreint les
règles des redirections.


j'utilise la plupart du temps require_once mais c'ets visiblement la
meme.


Absolument pas. Il y a un monde entre les deux. Tu connais l'histoire du
livreur de machine à laver (ou de frigo, je ne sais jamais) ?


Non pas vraiement :)
Mais je sais que require et require_once sont les meme, bien sur a la
difference pret que l'une est inclue qu'une seule fois. Je l'utilise tout
le temps car la plus part du temps c'est des scripts declarant des
constantes ou des fonctions.



Je ne comprends pas ton histoire d'aller retour.


Ce serait bien que tu la comprennes, parce que cela pourrait expliquer
la lenteur de ton site *beaucoup mieux* que par le type de CPU.


Mon site n'est pas franchement long ..... ce qui est long c'est la
navigation dans phpmyadmin.


6) As-tu lu la FAQ ?
http://faqfclphp.free.fr/#rub2.11
http://faqfclphp.free.fr/#rub2.12


Peut etre pas la faq .... mais a peut pres une bonne 40 aines de sites
differents ;)
J'irais faire un tour.


Je ne te demande pas de lire toute la FAQ (enfin... si, c'est toujours
intéressant, mais pas pour ton problème particulier) mais juste de lire
les deux paragraphes dont j'ai donné les liens ci-dessus.


Oui bien sur :) j'avais compris ;)


[...]
La fonction "getTBLGeneralValue" effectue une requete sql sur la base
et
renvoie dans "value" la valeur desire.


Bon, ceci répond à l'une de mes questions. Et que retourne-t-elle à
l'appelant lors du « return » ? 1 si tu as une valeur "maintenance"
et 0 sinon ?

Mon soucis : quelque qoit le retour de la requere (ie $value) je n'ai
pas
le resultat escompte.




Je le dis et le répète : le $value, ton code s'en fiche comme de l'an
40, à cause du if devant getTBLGeneralValue().

Vérifier le code de retour principal (testé par le premier if).



Tiens, je l'avais déjà écrit, mais tu n'as pas eu l'air de trouver ça
important car tu n'y as pas répondu.



Sisi .. mais dans un autre post ... qui n'est pas passé entre les mailles
du filet tissé par les moderateurs 0:-)