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 :

Librairie GD : Echec trop lourde tâche ?


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut Librairie GD : Echec trop lourde tâche ?
    Bonjour,

    Pour un besoin spécifique, je dois créer une image qui est une fusion de plusieurs images présentes sur mon serveur.
    J'utilise donc la librairie GD afin de créer une image de la taille nécessaire à accueillir toutes mes images collées bord à bord, l'une en dessous de l'autre (2 images côte à côte en largeur).
    Je vais vous épargner tout mon code car beaucoup de traitements pour récupérer les images nécessaires mais côté GD ça donne quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    $fond_img = imagecreatetruecolor($largeur, $hauteur);
    foreach($tabImages as $image){
       $img = imagecreatefromjpeg($image);
       imageresolution($img,$largeurImage,$hauteurImage);
       imagecopyresampled($fond_img,$img,$ref_largeur,$ref_hauteur,0,0,$largeurImage,$hauteurImage,$largeurSource,$hauteurSource);
       imagedestroy($img);
    }
    imagejpeg($fond_img, $cheminDestinationImage);
    ?>
    Ma contrainte est que la résolution de mon image finale doit être de 3840x2160 (car en largeur je colle 2 images de 1920x1080 dont je dois conserver la résolution) et que le nombre d'images à fusionner peut être important.
    Du coup, lorsque je dépasse un certain nombre d'images, le serveur me renvoi une Erreur 500.
    Pour le moment, le max sans tomber en erreur est la création d'une image de 20Mo avec un temps de chargement de 36 secondes.
    Pour info :
    - Dans php.ini : max_execution_time = 300 - max_input_time = 300 et memory_limit = 1024M
    - Dans IIS, propriétés FastCgi : Délai d'activité = 300 - Délai de demande = 90 - Délai d'inactivité = 300

    Concernant l'erreur, c'est bien au moment de la création de l'image (fonction imagejpeg) qu'elle se produit car si je commente cette ligne et la remplace par un "echo 'fin traitement'", mon script s'execute bien jusqu'à la fin.

    Ce comportement de GD est-il normal ?
    Y a-t-il un moyen de contourner cela (sachant que mes max execution time sont très large et que l'erreur se produit avant ce délai) ?

    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Concernant l'erreur, c'est bien au moment de la création de l'image (fonction imagejpeg) qu'elle se produit car si je commente cette ligne et la remplace par un "echo 'fin traitement'", mon script s'execute bien jusqu'à la fin.
    Tu parles d'erreur mais tu nous dis pas ce que c'est .
    Qu'elle message d'erreur précis te retourne le script ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par grunk Voir le message
    Tu parles d'erreur mais tu nous dis pas ce que c'est .
    Qu'elle message d'erreur précis te retourne le script ?
    Salut Grunk,
    Tout simplement
    Du coup, lorsque je dépasse un certain nombre d'images, le serveur me renvoi une Erreur 500.
    D'une machine distante ça donne :
    Erreur de serveur
    500 - Erreur interne au serveur
    La ressource que vous recherchez présente un problème, elle ne peut donc pas être affichée.
    En local ça donne :
    Le site Web ne peut pas afficher la page HTTP 500
    Causes les plus probables:
    - Le site web est en cours de maintenance
    - Le site web présente une erreur de programmation
    Je ne peux pas en savoir plus.
    J'ai même tenté, au cas où...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    try{
       imagejpeg($fond_img, $cheminDestinationImage);
    }
    catch(Exception $e){
       echo $e->getMessage();
       exit();
    }
    Mais rien, toujours Erreur 500.
    Et je précise que mon code ne présente pas d'erreur vu que c'est bien le nombre d'images traitées qui crée l'erreur (essaie en modifiant juste le nombre d'image : OK).

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dis-nous combien d'images (mini, maxi) tu veux fusionner.
    (et à partir de combien ça bugue)

    + un exemple d'images, qu'on puisse tester.


    Il est possible que GD n'ait pas le "temps" de traiter les données avant la boucle suivante...

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Une erreur 500 c'est un retour de ton serveur web pas de PHP.
    Il faut aller voir dans les journaux PHP (et/ou ceux du serveur web) pour voir l'erreur associée.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Bonjour jreaux62,

    En fait j'ai une arborescence de dossier du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DossierA\
                   Dossier J\
                                  00h00.jpg
                                  00h01.jpg
                                  00h02.jpg
                                  ...
                                  23h58.jpg
                                  23h59.jpg
                    Dossier J-1\
                                  00h00.jpg
                                  ...
                                  23h58.jpg
                                  23h59.jpg
    Avec le premier niveau composé de 10 dossiers (A ->J) et le second niveau composé de 61 dossier (J -> J-60) chacun contenant 1440 images (0h00 -> 23h59).

    Le but de l'appli est de permettre à l'utilisateur de selectionner un certain nombre de dossier du premier niveau, choisir une date et choisir un créneau horaire.
    Exemple : {A, C, F} - 2019/01/28 - 9:45 - 10:32

    Je vais ensuite fusionner les images de la date choisi, de chaque minute du créneau, pour chaque dossier sélectionné.
    Exemple : (en reprenant l'exemple du dessus, avec la disposition finale)

    [A][2019/01/28][9:45].jpg [C][2019/01/28][9:45].jpg
    [F][2019/01/28][9:45].jpg
    [A][2019/01/28][9:46].jpg [C][2019/01/28][9:46].jpg
    [F][2019/01/28][9:46].jpg
    .....
    [A][2019/01/28][10:31].jpg [C][2019/01/28][10:31].jpg
    [F][2019/01/28][10:31].jpg
    [A][2019/01/28][10:32].jpg [C][2019/01/28][10:32].jpg
    [F][2019/01/28][10:32].jpg


    L'idéal aurait été de pouvoir laisser un choix totalement libre à l'utilisateur en terme de nombre de dossiers sélectionnés et de créneau horaire ; mais vu le problème auquel je suis confronté avec un petit nombre de dossiers et un petit créneau, on dira que j'aimerai qu'il puisse sélectionner jusqu'à 4 dossier et un créneau d'une heure (donc 4 x 60 = 240 images à fusionner).

    Lors de mes tests, il me semble que ça tombait en échec à partir d'une cinquantaine d'images (désolé je n'ai pas ma plateforme de dev avec moi le WE)
    Voilà un exemple d'image LIEN

    Merci !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je vois bien ton exemple d'image...

    ... mais à quoi ressemblent les 240 (!) images que tu veux fusionner ?

    Et je ne vois pas le rapport entre l'image que tu montres, et les créneaux horaires ou autres dossiers à choisir...

  8. #8
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Je vois bien ton exemple d'image...

    ... mais à quoi ressemblent les 240 (!) images que tu veux fusionner ?
    Elles ressemblent à celle que j'ai mise en lien, tu n'y as pas accès ?

    Citation Envoyé par jreaux62 Voir le message
    Et je ne vois pas le rapport entre l'image que tu montres, et les créneaux horaires ou autres dossiers à choisir...
    C'était juste pour donner la logique de mon appli, mais oui pour faire simple il s'agit de fusionner un certain nombre d'images (le plus possible) comme celle que j'ai mise en lien.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Donc, tu as 240 images de la taille de celle en exemple ??

    Qu'entends-tu alors par "fusionner" ?
    • Les "coller" les une à coté des autres ?
    • Les "coller" les une SUR les autres * ?

    * (on peut le faire avec des images transparentes, png ou gif, pour ajouter des icônes sur une carte par exemple)

    Citation Envoyé par sebastien4444 Voir le message
    ...C'était juste pour donner la logique de mon appli...
    Désolé, mais je ne comprends toujours pas à quoi ça sert... ni quelle est la "logique"...


    D'autre part, dans le code que tu donnes (1er message), tu as plein de variables PHP, dont on ne sait pas grand chose (ni où et comment elles sont définies) :
    • $ref_largeur, $ref_hauteur, $largeurImage, $hauteurImage,...


    Ca n'aide pas à se faire une idée.

  10. #10
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Donc, tu as 240 images de la taille de celle en exemple ??

    Qu'entends-tu alors par "fusionner" ?
    Les "coller" les une à coté des autres ?
    Les "coller" les une SUR les autres * ?
    ==>
    Ma contrainte est que la résolution de mon image finale doit être de 3840x2160 (car en largeur je colle 2 images de 1920x1080 dont je dois conserver la résolution)
    Ce qui répond à tes 2 questions : oui elles font toutes cette taille-là et je dois les coller comme l'exemple que j'ai donné en version textuel : à la fois côte à côte et les unes au dessus des autres (si 240 images ça donne un quadrillage d'images de 2x120) :
    img1 img2
    img3 img4
    img5 ...
    img119 img120.


    Citation Envoyé par jreaux62 Voir le message
    Désolé, mais je ne comprends toujours pas à quoi ça sert... ni quelle est la "logique"...
    J'ai 10 PC qui affichent chacun une supervision différente
    Cette supervision évolue dans le temps en fonction des pannes qui se produisent sur le système supervisé.
    J'ai un programme sur chaque PC qui capture l'écran de celui-ci toutes les minutes.
    Je récupère toutes les images capturées sur un serveur (en l'occurence mon serveur web) avec un rétention de 2 mois.
    J'ai donc bien sur mon serveur : 10 dossiers (les 10 PC), contenant chacun environ 60 dossiers "YYYY-MM-DD" (2 mois), contenant chacun 1440 fichiers images (capture d'écran toutes les minutes sur une journée soit 1440 minutes).
    Le besoin de l'utilisateur est de pouvoir suivre l'evolution de la supervision de plusieurs pc en même temps, pour une date et un interval de temps choisi.
    D'où mon exemple, en imaginant que l'utilisateur ai choisi PC A, PC C et PC F, la date du 28/01 et l'interval de temps 9h45-10h32. (pour l'exemple [PC][YYYY/MM/DD][HH:MN].jpg représente l'image du pc [PC] capturé le YYYY/MM/DD à HH:MN.
    [A][2019/01/28][9:45].jpg [C][2019/01/28][9:45].jpg
    [F][2019/01/28][9:45].jpg
    [A][2019/01/28][9:46].jpg [C][2019/01/28][9:46].jpg
    [F][2019/01/28][9:46].jpg
    .....
    [A][2019/01/28][10:31].jpg [C][2019/01/28][10:31].jpg
    [F][2019/01/28][10:31].jpg
    [A][2019/01/28][10:32].jpg [C][2019/01/28][10:32].jpg
    [F][2019/01/28][10:32].jpg
    Citation Envoyé par jreaux62 Voir le message
    D'autre part, dans le code que tu donnes (1er message), tu as plein de variables PHP, dont on ne sait pas grand chose (ni où et comment elles sont définies) :
    $ref_largeur, $ref_hauteur, $largeurImage, $hauteurImage,...
    Je n'ai pas voulu publier tout mon code par soucis de simplicité et car toute la partie fusion des images au bon emplacement ne présente pas de problème.
    De plus, si tu voulais le tester, il faudrait que tu crées la même arborescence de dossier que moi, peuplé d'images avec le même nommage que sur mon serveur ("yyyy-dd-mm hh-mn-ss.jpg"), créer un répertoire virtuel (la racine de mes dossiers)... Bref beaucoup de choses pas très utile quand tu peux tester ça plus simplement en utilisant une seule image (celle dont j'ai donné le lien) dupliqué plusieurs fois dans un dossier test.
    Je viens de tester avec le code suivant : pour 100 image ça passe, pour 130 ou plus j'obtiens l'erreur 500.
    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
    <?php
    $dossierImageSource = "C:\\Users\\moi\\test\\source";
    $dossierImageDest = "C:\\Users\\moi\\test\\destination";
    $nomImageDest = "test.jpg";
    $tabImages = scandir($dossierImageSource);
    array_shift($tabImages); // pour retirer "."
    array_shift($tabImages); // pour retirer ".."
    $largeur = 3840; 
    $hauteur = (count($tabImages)/2)*1080;
    $ref_largeur = 0;
    $ref_hauteur = 0;
    $compteurImg = 1;
    $fond_img = imagecreatetruecolor($largeur, $hauteur);
    foreach($tabImages as $image){
       $img = imagecreatefromjpeg("$dossierImageSource\\$image");
       imageresolution($img,1920,1080);
       imagecopyresampled($fond_img,$img,$ref_largeur,$ref_hauteur,0,0,1920,1080,1920,1080);
       imagedestroy($img);
       $compteurImg++;
    	if($compteurImg%2==0){
    		$ref_largeur = 1920;
    	}else{
    		$ref_largeur = 0;
    		$ref_hauteur += 1080;
    	}
    }
    imagejpeg($fond_img, "$dossierImageDest\\$nomImageDest");
    echo "<p><img style=\"width:100%;\" src=\"$dossierImageDest\\$nomImageDest\" /></p>";
    ?>

  11. #11
    Invité
    Invité(e)
    Par défaut
    1- Je me pose encore UNE question :
    • "Est-ce que générer une seule grande image est la meilleure solution ?"

    (surtout avec autant d'images, et une librairie GD assez lourde...).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $largeur = 3840; 
    $hauteur = (count($tabImages)/2)*1080;
    As-tu affiché $hauteur ?
    Ça donne quoi ?

    2- On est d'accord que cette image sera de plus en plus lourde, au fur et à mesure.
    Tu devrais afficher le poids de l'image à chaque tour de boucle.
    Il est possible qu'elle finisse par dépasser une valeur maxi.


    3- As-tu déjà pensé à générer un fichier PDF ??
    • où tu peux très bien positionner tes images comme tu le souhaites,
    • où GD n'est plus utile, puisqu'on ne "fusionne" pas les images.

    J'ai le sentiment que ce serait plus efficace et rapide...
    Dernière modification par Invité ; 16/02/2019 à 16h25.

  12. #12
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Alors :

    1- A la base j'affichais tout simplement chaque image et j'organisais tout ça en CSS, mais les utilisateurs finals veulent quelque chose de transportable, qui ne les contraignent pas à exploiter l'info via explorateur web et à être sur le réseau ; ils m'ont donc demandé d'avoir tout sur un seul fichier

    Lors de mon dernier test (avec le code fourni précédement), j'ai "réussi" à affiché la fusion de 120 images, soit une hauteur de 64800px et une taille de fichier de 35.6Mo.
    Je dis "réussi" car quand j'ai voulu réessayer un peu plus tard, je me suis retrouvé avec un autre problème : fichier bien généré correctement mais pas affiché dans le navigateur (petite croix comme si l'image n'existait pas).
    Bref, ça me fait réaliser que l'erreur ne se produit pas pour un nombre d'image fixe car pour un même nombre d'image : une fois ça va fonctionner, celle d'après Erreur 500 et encore une autre fois le fichier est généré mais pas affiché
    Par contre en dessous d'un certain nombre ça fonctionne tout le temps et au dessus d'un certain nombre ça tombe en échec tout le temps.

    2- je ne peux pas afficher le poids de l'image à chaque nouvelle fusion car la fonction getimagesize() de GD prend un fichier en argument ; or mon fichier n'est réellement crée qu'à la fin de mon script avec la fonction imagejpeg() ; avant ça je n'ai qu'une "resource" contenu dans ma variable $fond_img.
    Et dans tous les cas, même si c'était possible, je ne verrai cette info que dans les cas où mon script fonctionne.

    3- Bonne idée, j'avoue que je n'y avais pas pensé !
    Faut-il encore que le format pdf conviennent aux utilisateurs de l'appli

  13. #13
    Invité
    Invité(e)
    Par défaut
    Un fichier PDF est tout indiqué.

  14. #14
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Merci pour la piste, en espérant que ça convienne aux utilisateurs.

    Cependant j'avoue être curieux de savoir pourquoi GD me fait des échecs à partir d'un certain poids de fichier? temps de traitement?
    La doc PHP de la librairie ne stipule aucun max pour cela... Et je n'ai aucun moyen de savoir exactement l'origine de l'échec (erreur 500 c'est trop vague malheureusement, et pas plus d'info dans les logs IIS).
    Bref, si quelqu'un qui aurait une piste là dessus passe par là... A votre bon coeur

Discussions similaires

  1. Raffraichissement d'image trop lourd
    Par ppopov dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 07/02/2006, 18h41
  2. base trop lourde
    Par marie49 dans le forum Access
    Réponses: 7
    Dernier message: 26/12/2005, 02h40
  3. variable de session trop lourde ???
    Par LE NEINDRE dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 11/10/2005, 14h34
  4. [CGI] variable de session trop lourde ????
    Par LE NEINDRE dans le forum Web
    Réponses: 2
    Dernier message: 07/10/2005, 09h12
  5. Réponses: 11
    Dernier message: 22/03/2005, 01h04

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