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

Bibliothèques et frameworks PHP Discussion :

[GD] Problème de boucle pour redimensionner plusieurs images ...


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut [GD] Problème de boucle pour redimensionner plusieurs images ...
    Bonjour,

    voici ma boucle qui traite tous les fichiers du tableau $tab_online:

    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
    44
    45
    46
    47
    48
     
     
    for($i=0; $i<count($tab_online); $i++) 
    { 
     
    $src = "http://mon.site.com/".str_replace(" ", "%20", $tab_online[$i]); 
     
    if (substr($src, -3) == "jpg") 
    { 
     
    $img = imagecreatefromjpeg($src); 
    $size = getimagesize($src); 
     
    $max_width = 800; 
    $max_height = 600; 
     
    $width = $size[0]; 
    $height = $size[1]; 
     
    if ( $width > $height ) 
    { 
     
    $dst_height = $height * $max_width / $width; 
    $dst_width = $max_width; 
     
    } 
    else 
    { 
     
    $dst_width = $width * $max_height / $height; 
    $dst_height = $max_height; 
    } 
     
    $dst = imagecreatetruecolor(round($dst_width), round($dst_height)); 
    $dst_thumbs = imagecreatetruecolor(round($dst_width * 25 / 100), round($dst_height * 25 / 100)); 
     
    imagecopyresampled($dst, $img, 0, 0, 0, 0, round($dst_width), round($dst_height), $width, $height); 
     
    imagecopyresampled($dst_thumbs, $img, 0, 0, 0, 0, round($dst_width * 25 / 100), round($dst_height * 25 / 100), $width, $height); 
     
    imagejpeg($dst, "../../photos/".$new_dir."/".$i.".jpg"); 
    imagejpeg($dst_thumbs, "../../photos/".$new_dir."/thumbs/".$i.".jpg"); 
     
    imagedestroy($img); 
    imagedestroy($dst); 
    imagedestroy($dst_thumbs); 
     
    }
    Si je la laisse comme ça, le serveur me retourne:
    Fatal error: Maximum execution time of 30 seconds exceeded in /home ...
    et une partie des photos n'est pas traitée.

    Si j'ajoute set_time_limit(300); pour repousser le timeout à 5 min, l'erreur ne s'affiche pas mais l'opération n'aboutie pas non plus...

    En isolant avec des 'echo' avant et après les fonctions, puis en chronométrant la vitesse d'éxécution des fonctions: il se trouve que l'application bloque au niveau de "imagecopyresampled" mais jamais sur la même image. Ce qui exclu le problème de la source.

    J'ai essayé de mettre un sleep(1); dans la boucle pour ralentir l'éxécution au càs où le problème viendrait du fait que l'appli s'emballerait.
    J'ai aussi essayé avec une "function" ...

    Rien à faire...

    Ce que je ne comprend pas c'est le timeout...
    avec une simple boucle
    for($i=0; $i<100; $i++)
    {
    sleep(1); // pause d'1sec à chaque itération
    }

    l'application doit donc durer 100 sec. Eh bien là, pas de Fatal error: Maximum execution time of 30 seconds exceeded in /home ...


    Pour info je suis sur un 90plan de chez OVH

    Merci pour les infos...

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Salut,

    l'application doit donc durer 100 sec. Eh bien là, pas de Fatal error: Maximum execution time of 30 seconds exceeded in /home ...
    L'explication est simple :
    La fonction set_time_limit() et la directive de configuration max_execution_time n'affectent que le temps d'exécution du script lui-même. Tout temps passé en dehors du script, comme un appel système utilisant system(), des opérations sur les flux, les requêtes sur base de données, etc. n'est pas pris en compte lors du calcul de la durée maximale d'exécution du script. (cf. http://www.php.net/set_time_limit)

    Or sleep() n'est pas considéré comme du temps d'exécution je pense


    Pour ton script, une solution serait de diviser l'exécution entre plusieurs appels, puisque apparement ça passe bien avec une seule image.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut
    sleep() n'est pas considéré comme du temps d'exécution je pense
    c'est aussi ce que je pense... alors que pourtant le faite de faire une pause ne peut-être considéré comme un échange de flux ou une opération effectuée en dehors du script...

    Pour ton script, une solution serait de diviser l'exécution entre plusieurs appels, puisque apparement ça passe bien avec une seule image
    c'est ce que j'ai essayé de faire avec 2 ex:
    1) avec sleep() je pensais que l'appli ne serait pas surchargé... et prendrait le temps... queneni !
    2) avec un appel à une fonction et une boucle avec un sleep() pour faire comme au dessus mais en plus léger... queneni !

    je ne vois pas comment faire autrement ... si je bloque à 100 photos 800x600 ça marche... mais je ne vois pas comment passer les autres facilement, sans action de l'utilisateur...

    ce qui me gonfle c'est que le page s'arrête sans erreur (à condition d'avoir un set_time_limit(300);

    vu que imagecopyresampled reourne true ou false je me suis dit que je pourrais mettre:

    while(!imagecopyresampled($dst, $img, 0, 0, 0, 0, round($dst_width), round($dst_height), $width, $height))
    {
    sleep(1);
    }

    ca ne fait rien de plus...

    et même :

    imagecopyresampled($dst, $img, 0, 0, 0, 0, round($dst_width), round($dst_height), $width, $height) or die ("Error");

    ne retourne rien...

    on dirait que le serveur abandonne l'opération en cours de route...

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 50
    Points
    50
    Par défaut
    réponse de la hotline:

    Bonjour,

    dans notre environnement cette variable n'a pas d'effet, nous avons des robots qui check en continu l'execution des scripts.

    (au sujet du set_time_limit(); )

    donc solution découper le programme en plusieurs partie pour retailler de 50 images en 50 ou moins ...

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. boucles pour lire plusieurs images
    Par eviasra dans le forum MATLAB
    Réponses: 8
    Dernier message: 27/12/2016, 13h51
  2. [ImageMagick] Problème dans le code pour redimensionner une image
    Par pierrot10 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/06/2007, 14h06
  3. Réponses: 3
    Dernier message: 11/01/2006, 17h44
  4. [ImageMagick] Boucle pour créer plusieurs images
    Par zimotep dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 10/01/2006, 21h44
  5. [MySQL] Boucle pour récuperer les images de la base
    Par tchoukapi dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/11/2005, 16h04

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