[RESOLU] Problème redimentionnement images par lot, GD & boucle

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Problème redimentionnement images par lot, GD & boucle

Re: Problème redimentionnement images par lot, GD & boucle

par Jaguaaaar » 30 janv. 2014, 12:39

En effet, l'affichage des erreurs n'étais pas activé, je l'avais depuis activé et j'avais en fait une gateway timeout erreur 500...

Je viens de le résoudre...

Par contre le navigateur, en cours de travail, n'affichait plus le "echo" présent à la fin de chaque passage de la boucle...

Après m'être renseigné, c'est en effet le navigateur qui, ne recevant pas assez de données à afficher, bug, et n'affiche plus.

Du coup c'est le timeout de 0 réponse du serveur qui m'embêtais (le serveur bossait mais le nav ne recevait plus rien)

Ca fonctinnait avec le "print_r" car ça envoyait une masse de données et le nav en recevait donc "assez", dans ce cas là no soucy.

En fouillant sur Google j'ai trouvé une fonction bien utile qui force le navigateur à faire un refresh et afficher le "peu" de données qu'il a reçu.

La fonction en question est flush() et ob_flush()

Le code finale qui fonctionne donne donc :



Code : Tout sélectionner

if($rep = opendir($chemin)) // le if au cas où on s'est planté de répertoire pour afficher erreur au lieu de planter { set_time_limit(0); // pour outrepasser le timeout dserveur de script //J'exécute le script de création de miniatures while(false !==($fichier = readdir($rep))) // tant que $fichier renvoie une valeur { $extension = strrchr($fichier,'.'); // ça nous renvoie .jpg $extension = substr($extension,1); // on vire le point pour n'avoir que jpg if($extension == "jpg" || $extension == "JPG") // n'affiche que les jpg { // Redimensionner une image avec GD $source = imagecreatefromjpeg("$chemin/$fichier"); // La photo est la source $destination = imagecreatetruecolor($xminia, $yminia); // On crée la miniature vide // Les fonctions imagesx et imagesy renvoient la largeur et la hauteur d'une image $largeur_source = imagesx($source); $hauteur_source = imagesy($source); $largeur_destination = imagesx($destination); $hauteur_destination = imagesy($destination); // On crée la miniature imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source); //on libère la mémoire de l'image d'origine imagedestroy($source); //on indique le chemin pour la miniature $chemindest = $chemin . '/mini/mini_' . $fichier; // On enregistre la miniature sous le nom "$mini_fichier.jpg"); imagejpeg($destination, $chemindest); $i++; // on libère la mémoire de la photo qui a été enregistré sur le disque imagedestroy($destination); echo 'Album ' . $_POST['doss'] . ' : La miniature ' . $fichier . ' a bien été créé (' . $i . ' sur ' . $j . ')<br />'; ob_flush(); flush(); ob_flush(); flush(); } else { echo ""; } } closedir($rep); echo '<h2><br />Fin de la création des miniatures de l\'album ' . $_POST['doss'] . '<br /></h2>'; } else { echo "erreur dans le répertoire !! <br />"; echo $chemin; }


Et voilà !! Merci en tout cas d'avoir pris le temps de me lire et de me répondre

Bonne continuation

Re: Problème redimentionnement images par lot, GD & boucle

par Genova » 29 janv. 2014, 17:05

Salut,

ce n'est pas possible que ton script s'arrête brutalement sans raison. Il y a un probablement une erreur qui est levée, quelle est elle ? Si tu ne vois pas d'erreur, vérifie que tu as bien activé l'affichage des erreurs, tu peux ajouter ça au début de ton script histoire d'être sur :
error_reporting(E_ALL);
ini_set('display_errors', 'on');

Problème redimentionnement images par lot, GD & boucle

par Jaguaaaar » 29 janv. 2014, 14:17

onjour à tous, je tente de créer un album en php.

Pour celà j'ai une fonctionne qui scanne un répertoire, liste les fichiers JPG, puis fait une boucle et les redimentionne à la lumière de ce que j'ai appris dans le tuto php.

Mon problème est dur à cibler, je m'explique.

Dans un répertoire contenant des photos ne pesant pas bien lourd (1Mo chacune environ), aucun souci ça fonctionne impeccablement

Dans un autre répertoire contenant de très grosses photos JPG (entre 8 et 18Mo pour les plus grosses), le script fonctionne mais s'arrête de façon brutale et sans erreur (au bout d'une vingtaine d'images)

J'ai pensé à un problème d'allocation mémoire bien que je n'ai pas d'erreur, mais :

c'est un NAS, donc j'ai accès au PHP.ini et j'ai augmenté la mémoire allouée à 256Mo, j'ai augmenté tous les timout à 300 ou 600 -----> mêmes symptomes

j'observe que les miniatures correctement créés ne sont pas les X premiers (ordre aléatoire pour lequel je n'arrive pas à trouver de logique)

si je vide mon dossier pour ne garder que l'image la plus grosse, celle ci ne pose aucun souci

J'utilise imagedestroy sur la source comme la destination...

J'ai parcouru google dans BEAUCOUP de sens, je n'ai pour le moment rien trouvé qui m'aide....

Des idées? Voilà le bout de code en question
if($rep = opendir($chemin)) // le if au cas où on s'est planté de répertoire pour afficher erreur au lieu de planter
            {
                while(false !==($fichier = readdir($rep))) // tant que $fichier renvoie une valeur
                    {
                        $extension = strrchr($fichier,'.'); // ça nous renvoie .jpg
                        $extension = substr($extension,1);  // on vire le point pour n'avoir que jpg
                        if($extension == "jpg" || $extension == "JPG") // n'affiche que les jpg
                            {
                                // Redimensionner une image avec GD : à priori ça bug à cause de la mémoire?
                                $source = imagecreatefromjpeg("$chemin/$fichier"); // La photo est la source
                                $destination = imagecreatetruecolor($xminia, $yminia); // On crée la miniature vide
                                // Les fonctions imagesx et imagesy renvoient la largeur et la hauteur d'une image
                                $largeur_source = imagesx($source);
                                $hauteur_source = imagesy($source);
                                $largeur_destination = imagesx($destination);
                                $hauteur_destination = imagesy($destination);
 
                                // On crée la miniature
                                imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source);
                                 
                                //on libère la mémoire de l'image d'origine
                                imagedestroy($source);
                                 
                                //on indique le chemin pour la miniature
                                $chemindest = $chemin . '/mini/mini_' . $fichier;
                                // On enregistre la miniature sous le nom "$mini_fichier.jpg");
                                imagejpeg($destination, $chemindest);
                                $i++;
                                 
                                // on libère la mémoire de la photo qui a été enregistré sur le disque
                                imagedestroy($destination);
                                 
                                //confimation de création image par image
                                echo '<br />Miniature ' . $chemindest . ' correctement créé<br />';    
                                 
                            }
                        else
                            {
                                echo "";
                            }
                    }
                echo '<h2><br />Fin de la création des miniatures de l\'album ' . $_POST['doss'] . '<br /></h2>';  
            }
        else
            {
                echo "erreur dans le répertoire !! <br />";
                echo $chemin;
            }
Je précise que j'ai créé plus haut dans le code le sous répertoire "mini", sans aucun souci)

Merci d'avance !