IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Indexation des images avec scandir


Sujet :

Langage PHP

  1. #1
    Gunner4902
    Invité(e)
    Par défaut [Tableaux] Indexation des images avec scandir
    Bonjour à tous,

    Voici mon bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    				$dir = "images";
    				$folder = scandir($dir);	//répertorie les sous-dossiers (et les fichiers)
    				//print_r ($folder);   // renvoie Array ( [0] => . [1] => .. [2] => Thumbs.db [3] => …)
    				unset($folder[0], $folder[1], $folder[2]);  //supprime [0] => . [1] => .. [2] => Thumbs.db
    				$fo = array_rand($folder);
    				$impath = "$dir/$folder[$fo]";
    				$folder2 = scandir($impath);	//répertorie les sous-dossiers (et les fichiers)
    				unset($folder2[0], $folder2[1], $folder2[2]);  //supprime [0] => . [1] => .. [2] => Thumbs.db
    				$fo2 = array_rand($folder2);
    				$impath2 = "$impath/$folder2[$fo2]";
    				$file = scandir($impath2);	//répertorie les fichiers des sous-dossiers
    				$fi = array_rand($file);
    				$image = "$impath2/$file[$fi]";
    				list($width, $height, $type, $attr) = getimagesize("".$image."");
    				while (!@getimagesize($impath2 . '/' . $file[$fi])) 
    					{
    					$i = array_rand($file);
    					continue;
    					}
    				echo "<img src=\"".$image."\"  />";
    			?>
    Le code fonctionne bien, pas de soucis là dessus. Par contre j'ai 60 Mo d'images et le serveur tend à ne plus afficher la page contenant le code…
    De quoi celà peut-il venir, et quelle est la solution, sachant que les dossiers images vont encore augmenter en volume ?
    Merci

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Ca fait combien de fichiers ?

  3. #3
    Gunner4902
    Invité(e)
    Par défaut
    Vu qu'il y a des dossiers et des sous-dossiers je ne sais pas exactement, mais je dirai dans les 700 fichiers .jpg

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Le temps d'exécution de la page est de quel ordre ?

  5. #5
    Gunner4902
    Invité(e)
    Par défaut
    C'est ça qui est bizarre. Parfois le serveur répond en moins d'une seconde, et parfois il reste bloqué pendant un temps supérieur à 5 minutes (dans ce cas je fais F5, et une fois sur deux ça affiche la page instantanément, l'autre fois ça ne résoud rien et je dois relancer le navigateur et parfois le serveur…)

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Ah... Tu as la possibilité de surveiller et analyser le comportement des serveurs ? Ils sont saturés en CPU et/ou mémoire quand ça met longtemps à répondre ?

  7. #7
    Gunner4902
    Invité(e)
    Par défaut
    Je viens de regarder (je n'avais pas pensé à le faire avant ).
    Au niveau de la mémoire, aucun soucis.
    Par contre tu as vu juste il y a une saturation du CPU (95%) sur httpd.exe au niveau des services…

    Celà provient de quoi ? Que puis-je faire pour éviter celà ?
    Merci.

  8. #8
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Je sais pas trop. Faut déterminer quel(s) script(s) sont responsables de ce pic de charge. Le pb peut venir d'un script trop gourmand en CPU (parce que boucle infinie par exemple) ou parce que le serveur est trop sollicité (trop de monde à se connecter). Tu peux peut-être éliminer rapidement la seconde cause (charge) car tu sais par exemple que c'est un serveur de développement que seules 2 ou 3 personnes utilisent. Pour identifier le script, c'est pas forcément évident. Faut voir si tu arrives à corréler une action que tu fais sur ton site avec le pic de CPU.

    Une fois que tu as identifié la vraie cause, faut voir comment corriger le pb. Si c'est ton script (parce que ça pourrait être un autre), faut voir pour l'optimiser, identifier dedans ce qui consomme, etc., voire même changer le principe du script pour moins charger la machine.

  9. #9
    Gunner4902
    Invité(e)
    Par défaut
    Je suis le seul à me servir de ce serveur, car comme tu l'as deviné, c'est un serveur de développement.

    Pour l'action qui sature, voici rapidement le process :

    => j'appelle la page index.php qui elle même appelle une page random.php via un JS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <script type="text/javascript">
    			function F11() {window.open("/random.php","","");}
    			setTimeout("self.close();",1)
    		</script>
    	</head>
    	<body onload="javascript:F11()">
    La page random.php contient le code cité dans le premier post (mon premier travail en PHP car je débute) ainsi que la feuille de style CSS (dans le <head> et ce code ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <div id="modele">
    			<span onClick="show('modele_spoiler'); hide('modele_img');" ></span>
    			<div id="modele_img"></div>
    			<div id="modele_spoiler">
    				<?php
    					$fichier_modele = file("+modele.php", FILE_IGNORE_NEW_LINES);
    					$fn = array_rand($fichier_modele);
    					if ($folder[$fo] == "modele-1945"){
    						$res = count_chars($file[$fi],1);
    						$w=0;
    						while (list($k,$v)=each($res))
    						{
    							$w=$w+$v;
    						}
    						if ($w <= "9"){
    							$fichier_modele2 = file("+modele.php", FILE_IGNORE_NEW_LINES);
    							$fn2 = array_rand($fichier_modele2);
    							while ($fn == $fn2) { $fn2 = array_rand($fichier_modele2); } //empêche deux fois l'affichage du même modele
    							echo "<span class=\"$fichier_modele[$fn]\">$fichier_modele[$fn]</span><span class=\"et\"> et </span><span class=\"second\"><span class=\"$fichier_modele2[$fn2]\" >$fichier_modele2[$fn2]</span></span>";
    						}
    						else{
    							ereg("^(.+)\((.+)$", $file[$fi], $modele_pix);
    							echo "<span class=\"$modele_pix[1]\">$modele_pix[1]</span><span class=\"et\"> et </span><span class=\"second\"><span class=\"$fichier_modele[$fn]\" >$fichier_modele[$fn]</span></span>";
    							}
    					}
    					else{
    						$res = count_chars($file[$fi],1);
    						$w=0;
    						while (list($k,$v)=each($res))
    						{
    							$w=$w+$v;
    						}
    						if ($w <= "9"){
    							echo "<span class=\"$fichier_modele[$fn]\">$fichier_modele[$fn]</span>";
    						}
    						else{
    							ereg("^(.+)\((.+)$", $file[$fi], $modele_pix);
    							echo "<span class=\"$modele_pix[1]\">$modele_pix[1]</span>";
    							}
    					}
    				?>
    			</div>
    		</div>
    Toute aide pour optimiser le code est la bienvenue, j'ai fait du mieux que j'ai pu, j'y ai passé pas mal de jours et suis incapable de m'autocorriger…

    Merci

  10. #10
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Y a quoi dans ton fichier modele.php ? Pourquoi y a un + devant le nom ? S'il s'agit d'un gros fichier, je t'invite à lire le 3ème commentaire du manuel PHP de file : http://www.php.net/manual/en/function.file.php

  11. #11
    Gunner4902
    Invité(e)
    Par défaut
    Le + devant, c'est juste parce que le fichier s'appelle +modele.php

    il contient une liste de nom de voiture (environ une 30aine) et pèse 3 ko

    Le but de la page est de piocher dans une image aléatoire, et de mettre un nom de voiture.

    Genre tu as "vroum vroum" la R4 etc
    C'est un truc ludique pour les enfants…

    Il y a 4 fichiers php (des txt renommés en fait) appellés basés sur le meme principe (nom de la famille qui part en vacances ; destination des vacances ; nom de la voiture et panne de la voiture). Ils pèsent tous 1 ko sauf modele qui pèse 3 ko.

    Ensuite à partir de l'image et des éléments, l'enfant doit créer une histoire.

  12. #12
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Les seuls truc que je vois qui pourraient prendre du CPU c'est la boucle while du tout premier bout de code que tu nous a donné (1er message) et les array_rand (même code). Ce que tu peux faire, c'est commenter les array_rand pour voir si c'est ça qui prend du CPU. Si ce n'est pas ça, je serais intéressé par connaître le nombre d'itération du while (avec array_rand).

  13. #13
    Gunner4902
    Invité(e)
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    Ce que tu peux faire, c'est commenter les array_rand pour voir si c'est ça qui prend du CPU.
    Je fais comment pour commenter un array_and ?



    Citation Envoyé par _Mac_ Voir le message
    Si ce n'est pas ça, je serais intéressé par connaître le nombre d'itération du while (avec array_rand).
    Comment je peux te donner cette info ?

    merci

  14. #14
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    En fait, ce que je ne comprends pas c'est à quoi te sert ta boucle while et dans quel cas elle s'arrête. Ta boucle peut en effet durer très longtemps si $fi renvoie l'index d'un fichier image avant de lancer ta boucle : $i ne sert à rien dans ton while et donc le test !@getimagesize($impath2 . '/' . $file[$fi]) est toujours vrai et hop, boucle infinie. Donc, il faudrait déjà mettre $fi = array_rand($file); dans ta boucle while (au passage, le continue ne sert à rien, c'est utilise uniquement s'il y a des instructions après, ce qui n'est pas le cas dans ta boucle).

    Pour continuer sur cette boucle, plus il y a d'images dans ton répertoire, plus il y a des chances que array_rand($file) te renvoie une image, donc que ton while dure longtemps. En fait, elle n'est pas optimale, ta boucle. Si le but du jeu c'est "d'aléatoiriser" le tableau $file et d'afficher le résultat de ce classement aléatoire, utilise shuffle : ca fera une passe aléatoire pour tous tes fichiers, ce qui sera plus efficace, je pense. Mais si le besoin est également d'afficher un nombre aléatoire d'images, tu peux utiliser un shuffle + un tirage alétoire classique qui t'indique le rang max des n premiers objets du résultat de shuffle à utiliser.

  15. #15
    Gunner4902
    Invité(e)
    Par défaut
    Merci Mac de te pencher sur ce problème

    En fait si j'enlève la boucle While, tout fonctionne mieux au niveau du temps de réponse, mais j'ai le problème suivant :
    les fichiers
    .
    ..
    thumbs.db
    empêchent régulièrement l'affichage de l'image…

    Donc la boucle n'est là que pour ça.

    Si je mets le code suivant à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    list($width, $height, $type, $attr) = getimagesize("".$image."");
    unset($file[0], $file[1], $file[2]);
    echo "<img src=\"".$image."\" $attr name=\"nom_image\" />";
    le unset ne semble pas fonctionner… c'est pourquoi j'ai mis le while… si tu as une autre solution je suis preneur.

    Pour le shuffle, je l'utilise à la place du while, mais de quelle manière, je ne connais pas.

    Merci

  16. #16
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Si c'est juste pour éviter ., .. et thumbs.db, une boucle while, ça me paraît "violent" : pourquoi pas une bonne grosse gruge qui va éliminer de $file les éléments indésirés et qui remplace donc ton unset :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //unset($file[0], $file[1], $file[2]);
    // On elimine ., .. et thumbs.db de $file
    $file = array_diff($file, array(".", "..", "thumbs.db"));
    Je te conseille de changer tous tes unset par ce bout de code en gras car rien ne te garantit que les éléments 0, 1 et 2 correspondent à ces ., .. et thumbs.db, surtout si par un malheureux hasard, thumbs.db n'existe pas.

    Citation Envoyé par Gunner4902 Voir le message
    Pour le shuffle, je l'utilise à la place du while, mais de quelle manière, je ne connais pas.
    Ben cf. la doc PHP

  17. #17
    Gunner4902
    Invité(e)
    Par défaut
    Merci beaucoup Mac

    Le fait d'avoir supprimé while et d'avoir remplacé les unset par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $file = array_diff($file, array(".", "..", "Thumbs.db"));
    par contre ça ne marche que si je mets un T majuscule pour thumbs
    fait que le résultat est instantané. J'ai testé en appuyant une 30aine de fois sur F5 pour recharger la page et le résultat vient en moins d'une seconde.

    Un grand merci à toi !

  18. #18
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par Gunner4902 Voir le message
    par contre ça ne marche que si je mets un T majuscule pour thumbs
    Tu peux quand même rajouter "thumbs.db" (en miscule) dans le array, ça ne mangera pas de pain.

Discussions similaires

  1. Réponses: 12
    Dernier message: 04/05/2015, 14h58
  2. envoyer des images avec access
    Par dan664 dans le forum Access
    Réponses: 6
    Dernier message: 13/10/2005, 22h16
  3. Gestion des chemins des images avec une base de données...
    Par Nean dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/07/2005, 09h08
  4. Class de gestion des images avec rotation
    Par Johnny Boy dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 12h54
  5. Passer des Image avec SOAP
    Par pef421 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 01/03/2004, 22h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo