Discussion:
Relecture de repertoires avec nom de fichiers!
(trop ancien pour répondre)
otto
2007-12-08 19:17:59 UTC
Permalink
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>
Gerard Menvussa
2007-12-11 22:33:07 UTC
Permalink
Post by 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 ?
Bonjour

C'est la session qui semble poser problème. En effaçant le cookie de
session l'erreur ne se produit plus.
otto
2007-12-12 23:54:12 UTC
Permalink
Post by Gerard Menvussa
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 ?
Gerard Menvussa
2007-12-13 09:23:33 UTC
Permalink
Post by otto
Post by Gerard Menvussa
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" ?
Mickael Wolff
2007-12-12 09:10:57 UTC
Permalink
Post by otto
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.
Post by otto
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
otto
2007-12-12 23:54:12 UTC
Permalink
Post by Mickael Wolff
Post by otto
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.
Post by otto
while ($fp < count($files))
La taille du tableau $files ne change pas. Tu devrais plutôt faire un
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
Post by Mickael Wolff
il est logique que ton tableau contenant la liste des fichiers
double à chaque utilisation.
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.
Mickael Wolff
2007-12-13 13:21:18 UTC
Permalink
Post by otto
Merci beaucoup pour les informations.
Service !
Post by otto
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.
Post by otto
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 ?
Post by otto
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).
La performance.
Post by otto
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.
Post by otto
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.
Post by otto
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
otto
2007-12-13 21:16:02 UTC
Permalink
Post by Mickael Wolff
Post by otto
Merci beaucoup pour les informations.
Service !
Post by otto
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!
Post by Mickael Wolff
Post by otto
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.
Post by Mickael Wolff
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
otto
2007-12-14 19:37:55 UTC
Permalink
Post by Mickael Wolff
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
Gerard Menvussa
2007-12-20 17:16:50 UTC
Permalink
Post by otto
Post by Mickael Wolff
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.
Post by otto
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)
Post by otto
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.
Post by otto
Mais cela ne fonctionne pas.
Normal sans la session.

Continuer la lecture sur narkive:
Loading...