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

Relecture de repertoires avec nom de fichiers!

9 réponses
Avatar
otto
Bonjour



J'ai un problème avec le script simplifié ci-dessous!

Quand je démarre ce script pour la première fois env. 17'000 nom de fichiers sont lu depuis un répertoire (/camera25) en moin de 5 sec.

Quand je click sur le bouton (2ème depuis la gauche) ou le bouton reload du browser pour relire ce même répertoire cela va au timeout du provider soit plus de

2min!

Même problème avec les autres icones pour lire les autres répertoires (certain on moins de 2 fichiers)

Pour quel raison lorsque je charge ce script pour la première fois cela prend moins de 5 secondes, puis lorsque je rappelle ce script en mode SELF cela ne

fonctionne plus?

Y-a-t'il un cache à vider ou de variables à effacer ?



Voici un lien temporaire pour démontrer le problème : http://www.schlierholz.ch/camera/indexl.php



Le script:



<?php

session_start();



// Action on the button to select directory's

if (isset($_GET['c24_x'])) {

# Répertoire des images de la caméra

$pict_path = "camera24/";

}



elseif (isset($_GET['c25_x'])) {

$pict_path = "camera25/";

}



elseif (isset($_GET['c26_x'])) {

$pict_path = "camera26/";

}



elseif (isset($_GET['c27_x'])) {

$pict_path = "camera27/";

}



else

{

$pict_path = "camera25/";

}



echo $pict_path."<br>";



?>



<!-- Form to select directory's -->

<body>

<form action="<?PHP echo $_SERVER['PHP_SELF'] ?>" method="GET">

<p>

<input type="image" src="images/icon_camera.gif" name="c24">

<input type="image" src="images/icon_camera.gif" name="c25">

<input type="image" src="images/icon_camera.gif" name="c26">

<input type="image" src="images/icon_camera.gif" name="c27">

</p>

</form>

<form method="POST" action="--WEBBOT-SELF--">

<p>





<?php

$start = time();

$ordner = opendir($pict_path);



$i=0;

while ( $rfile = readdir($ordner) )

{

// only files without . and ..

if ($rfile != '.' && $rfile != '..' && substr($rfile,5,1) == '@')

{

// save filename to array

$files[$i]=$rfile;

$i++;

}

}

closedir($ordner);



// Sort array by name

sort($files);



// Save Session

$_SESSION['files'] = $files;



echo "Pictures : ".$i."<br>";



$end = time();

echo $end - $start."<br>";



$start = time();

$fp = 0;

$pos = 2;

$nodem = 0;

while ($fp < count($files))

{

$annee = substr($files[$fp],6,4);

$mois = substr($files[$fp],10,2);

if ($mois <> $rmois) {

echo"<img border='0' src='images/icon_mois.gif' width='16' height='14'>";

echo"<a target='c_gauche' href='dayshow.php?filtre=$annee$mois'> $annee$mois</a><br>";

// $nodem = $pos;

$rmois = $mois;

}

$fp++;

}



$end = time();



echo "Pictures : ".$fp."<br>";

echo $end - $start."<br>";



?>

</p>

</form>

</body>

</html>

9 réponses

Avatar
Gerard Menvussa
otto wrote:
Bonjour



J'ai un problème avec le script simplifié ci-dessous!

Quand je démarre ce script pour la première fois env. 17'000 nom de fichiers sont lu depuis un répertoire (/camera25) en moin de 5 sec.

Quand je click sur le bouton (2ème depuis la gauche) ou le bouton reload du browser pour relire ce même répertoire cela va au timeout du provider soit plus de

2min!

Même problème avec les autres icones pour lire les autres répertoires (certain on moins de 2 fichiers)

Pour quel raison lorsque je charge ce script pour la première fois cela prend moins de 5 secondes, puis lorsque je rappelle ce script en mode SELF cela ne

fonctionne plus?

Y-a-t'il un cache à vider ou de variables à effacer ?



Bonjour

C'est la session qui semble poser problème. En effaçant le cookie de
session l'erreur ne se produit plus.

Avatar
Mickael Wolff
Bonjour


Bonjour,

C'est visiblement un problème du code lorsque tu utilises la session
(car lorsque j'efface le cookie de session, le problème n'apparaît
plus). Est-ce que le serveur est en register_globals == On ? Si c'est le
cas, il est logique que ton tableau contenant la liste des fichiers
double à chaque utilisation.

while ($fp < count($files))


La taille du tableau $files ne change pas. Tu devrais plutôt faire un
truc du genre :

rsort($files) ;
for($fp = count($files) ; $fp == 0 ; $fp--)
{
// le code modifié pour fonctionner à l'envers de la logique initiale
}



--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
otto
On 11 Dec 2007 22:33:07 GMT, Gerard Menvussa wrote:



C'est la session qui semble poser problème. En effaçant le cookie de

session l'erreur ne se produit plus.




Est-il possible d'effacer un cookie session par programmation ?

Avatar
otto
On 12 Dec 2007 09:10:57 GMT, Mickael Wolff wrote:




Bonjour




Bonjour,



C'est visiblement un problème du code lorsque tu utilises la session

(car lorsque j'efface le cookie de session, le problème n'apparaît

plus). Est-ce que le serveur est en register_globals == On ? Si c'est le

cas, il est logique que ton tableau contenant la liste des fichiers

double à chaque utilisation.



while ($fp < count($files))




La taille du tableau $files ne change pas. Tu devrais plutôt faire un

truc du genre :



rsort($files) ;

for($fp = count($files) ; $fp == 0 ; $fp--)

{

// le code modifié pour fonctionner à l'envers de la logique initiale

}




Bonjour Mickaël,



Merci beaucoup pour les informations.

Oui sur ce serveur la register_globals est à ON



il est logique que ton tableau contenant la liste des fichiers

double à chaque utilisation.



La taille du tableau $files ne change pas. Tu devrais plutôt faire un truc du genre :



rsort($files) ;

for($fp = count($files) ; $fp == 0 ; $fp--)

{

// le code modifié pour fonctionner à l'envers de la logique initiale

}




En tant que débutant, je ne comprends pas ou est le problème de fichier qui double!

N'est il pas possible de réinitialiser les variables?

J'ai bien essayé avec unset() d'effacer les $tableaux! mais cela n'a pas fonctionné.

Quel est la différence entre un:



for($fp = count($files) ; $fp == 0 ; $fp--)

et

while ($fp < count($files))



avec mon problème de session. Il me semble que les deux sont des boucles?

Je vais tester la solution avec for() demain.


Avatar
Gerard Menvussa
On 11 Dec 2007 22:33:07 GMT, Gerard Menvussa wrote:

C'est la session qui semble poser problème. En effaçant le cookie de
session l'erreur ne se produit plus.


Est-il possible d'effacer un cookie session par programmation ?


Oui mais dans ce cas autant ne pas ouvrir de session.
Ce que je voulais dire c'est que le problème se produit
vraisemblablement au moment ou le tableau est stocké dans la session.

Ce qu'il faut savoir c'est que par défaut sur PHP les données de
sessions sont stockés dans un fichier. Il est possible qu'il y ait un
problème d'accès à ce fichier ? Je ne sais pas. Le PHP vérouille le
fichier de session avant de l'utiliser. Vous avez quoi comme valeur pour
"session.auto_start" ?


Avatar
Mickael Wolff

Merci beaucoup pour les informations.


Service !

Oui sur ce serveur la register_globals est à ON
En tant que débutant, je ne comprends pas ou est le problème de fichier qui double!


Est-ce que tu sais à quoi sert register_globals ? En fait, au
démarrage du script, les tableaux superglobaux $_GET, $_POST, $_COOKIE
et $_SESSION sont jetés dans la portée globale. Donc si la clé « files »
existe dans $_SESSION, une variable $files est créée.

Ceci explique que ton tableau $files, au second appel du script,
comporte déjà 27000 entrées et des brouettes. D'après ton script, tu
rajoutes une seconde fois les 27000 entrées. Conséquence : ton tableau
double. Ce doit être pour ça que ton while prend autant de temps.


N'est il pas possible de réinitialiser les variables?


Pourquoi sauvegardes-tu le contenu de $files si tu ne l'utilises pas
au second appel ?


J'ai bien essayé avec unset() d'effacer les $tableaux! mais cela n'a pas fonctionné.


Ben si. Mais tu peux aussi faire $files = null. Mais franchement,
poses-toi la question du pourquoi tu sauvegarde la liste des fichiers
dans la session (ce qui est une opération coûteuse avec un tableau aussi
grand, car ton tableau est sérializé, c'est à dire transformé en chaîne
de caractères).


Quel est la différence entre un:


La performance.

for($fp = count($files) ; $fp == 0 ; $fp--)


On appelle une fois count, puis on décrémente jusqu'à ce qu'il n'y ait
plus d'éléments.

while ($fp < count($files))


À chaque bouclage du while, tu appelles counts. Est-ce que la taille
du tableau change dans la boucle ? Non. Alors il est inutile de rappeler
à chaque coup la fonction.


avec mon problème de session. Il me semble que les deux sont des boucles?
Je vais tester la solution avec for() demain.


Oui, c'était juste en passant.

Mais le problème que tu rencontre est basique. Il faut que tu
apprennes à le résoudre seul, sinon tu vas passer des éternités à
attendre nos réponses. var_dump peut être ton ami par exemple, puisqu'il
affiche le contenu et le type d'une variable.

À bientôt.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
otto
On 13 Dec 2007 13:21:18 GMT, Mickael Wolff wrote:






Merci beaucoup pour les informations.




Service !



Oui sur ce serveur la register_globals est à ON

En tant que débutant, je ne comprends pas ou est le problème de fichier qui double!




Est-ce que tu sais à quoi sert register_globals ?




Oui je savais cela!



for($fp = count($files) ; $fp == 0 ; $fp--)




On appelle une fois count, puis on décrémente jusqu'à ce qu'il n'y ait

plus d'éléments.




Ok, c'est clair.



Mais le problème que tu rencontre est basique. Il faut que tu

apprennes à le résoudre seul, sinon tu vas passer des éternités à

attendre nos réponses. var_dump peut être ton ami par exemple, puisqu'il

affiche le contenu et le type d'une variable.




Ok, j'apprends avec un livre, alors si un réponse prend un peu de temps ce n'est par un grand problème.

Mais avec les détails reçu par ce message j'y vois plus clair. C'est ce que je reproche au deux livres que

j'ai. On apprend bien des détails, mais la philosophie PHP (si je peux appeler cela comme cela) est mal expliqué.



Je me suis fais un peu avoir parce que mon installation local (Wamp 5) à la register_globals à OFF et

l'essai que j'ai fais chez le provider d'un ami à la variable à ON de plus il est en PHP4!



Encore une fois merci


Avatar
otto
On 13 Dec 2007 13:21:18 GMT, Mickael Wolff wrote:



Ceci explique que ton tableau $files, au second appel du script,

comporte déjà 27000 entrées et des brouettes. D'après ton script, tu

rajoutes une seconde fois les 27000 entrées. Conséquence : ton tableau

double. Ce doit être pour ça que ton while prend autant de temps.




Vu que la variable register_globals est à on, j'ai supprimé session_start(),

maintenant le chargement des pages est super rapide.

Encore merci pour le conseil.



Je passe des variables par l'url et cela fonctionne sans problème.



Je désire parconte pas passer par l'url pour le tableau $files, mais l'avoir à disposition dans tous mes autres scripts.

Comment fais on cela sans $_SESSION?, normalement la variable devait être visible avec register_globals à On ?

Mais cela ne fonctionne pas.



Le provider à PHP Version 5.2.5 avec register_globals On

Avatar
Gerard Menvussa
otto wrote:
On 13 Dec 2007 13:21:18 GMT, Mickael Wolff wrote:

Ceci explique que ton tableau $files, au second appel du script,

comporte déjà 27000 entrées et des brouettes. D'après ton script, tu

rajoutes une seconde fois les 27000 entrées. Conséquence : ton tableau

double. Ce doit être pour ça que ton while prend autant de temps.


Vu que la variable register_globals est à on, j'ai supprimé session_start(),

maintenant le chargement des pages est super rapide.


Si vous supprimez session_start() : plus de session donc plus de
problèmes. Cela n'a ahma pas de rapport avec register_globals.


Je passe des variables par l'url et cela fonctionne sans problème.


Le problème n'est vraisemblablement pas relié au fait que vous passiez
ou non les variable grâce à la méthode GET (par l'URL) ou POST (pas par
l'URL)


Je désire parconte pas passer par l'url pour le tableau $files, mais l'avoir à disposition dans tous mes autres scripts.

Comment fais on cela sans $_SESSION?, normalement la variable devait être visible avec register_globals à On ?


$_SESSION est une super global elle est toujours disponible depuis
n'importe où *lorsque la session est démarré*.
Ce tableau représente un ensemble de données qui sont stockées sur le
serveur et associé à un identifiant unique "id de session" transmis par
un cookie. Donc si vous ne démarrez pas la session l'identifiant n'est
créé, pas envoyé dans un cookie lors de la première réponse, pas renvoyé
par le navigateur lors des requêtes suivantes et la variable $_SESSION
est vide.


Mais cela ne fonctionne pas.


Normal sans la session.