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 :

[Artichow] ob_start() / imagepng capricieux


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Artichow] ob_start() / imagepng capricieux
    Bonjour à tous !

    Je développement actuellement un application php qui nécessite de générer des graphiques. J'utilise pour ça Artichow.

    Pour mon application, j'utilise un framework basé sur le principe de fonctionnement du framework .NET pour ceux qui connaissent, c'est à dire que je suis en full object et que j'utilise des class "webcontrol" pour générer mon code html.

    Mon problème est le suivant : lorsque que j'utilise un webcontrol chart (qui utilise donc les classes Artichow), j'obtiens 2 comportements différents selon l'endroit où instancie ma class.

    1) Tout se passe bien, Artichow me retourne bien la "data" de l'image que je peux enregistrer dans un fichier et afficher dans une balise img.

    2) Artichow m'affiche directement l'image sur le navigateur au moment de l'appel à imagepng(), alors que (j'ai vérifié avec XDebug), la fonction ob_start() est appelé juste avant.

    Je ne comprends pas du tout ce deuxième comportement et je ne vois pas à quoi c'est dû. Pour info, mes appels à la fonction draw() de la class Graph Artichow s'effectuent toujours au même endroit dans le code et de la même façon. Seul l'endroit de la création de mon webcontrol change.

    Y aurait-il un comportement particulier de ob_start() ou imagepng() que je ne connaitrais pas ? Je n'ai aucune idée où chercher une erreur... passer mon code à XDebug ne m'a pas permis d'en apprendre plus.

    A cause de l'utilisation de mon framework il me semble difficile de copier mon code mais si vous pensez que ça peut vous aider je le ferais.

    J'espère que vous pourrez m'aider.

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    À mon avis tu fais un appel à ob_end_flush à la fin de ton buffer. Il faut récupérer le contenu bufferisé avec ob_get_contents et nettoyer le buffer.

    Si tu lis les commentaires postés sur la fonction imagepng, il y a des personnes qui font ce que tu souhaites :

    http://fr.php.net/manual/fr/function.imagepng.php#54432

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $imagefile = "changethistogourimage.gif";
    $image = imagecreatefromgif($imagefile);
     
    ob_start();
    imagepng($image);
    $imagevariable = ob_get_contents();
    ob_end_clean();

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse ThomasR.

    Ça ne vient pas de là. J'en suis sûr car :

    1) j'utilise les classes Artichow qui utilise ob_get_clean() (ce qui, si je ne me trompe pas reviens à ce que tu m'as proposé). Pour info, voici le code de la fonction qui est appelée :

    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
     
    private function drawImage(awImage $image, $return = FALSE, $header = TRUE) {
     
    		$format = $image->getFormatString();
     
    		// Test if format is available
    		if((imagetypes() & $image->getFormat()) === FALSE) {
    			awImage::drawError("Class Image: Format '".$format."' is not available on your system. Check that your PHP has been compiled with the good libraries.");
    		}
     
    		// Get some infos about this image
    		switch($format) {
    			case 'jpeg' :
    				$function = 'imagejpeg';
    				break;
    			case 'png' :
    				$function = 'imagepng';
    				break;
    			case 'gif' :
    				$function = 'imagegif';
    				break;
    		}
     
    		// Send headers to the browser
    		if($header === TRUE) {
    			$image->sendHeaders();
    		}
     
    		if($return) {
    			ob_start();
    		}
     
    		$function($this->resource);
     
    		if($return) {
    			return ob_get_clean();
    		}
    Elle est appelé avec $return à TRUE et $header à FALSE, et j'ai vérifié son comportement avec XDebug, pas de problème sur ce point.

    2) Comme je l'ai dis lors de mon premier message, ce même code fonctionne "parfois". Cela semble dépendre de l'endroit où j'instancie ma class.

    3) Avec XDebug le problème interviens lors du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		$function($this->resource);
    où $function = imagepng et non au moment du ob_get_clean(). Et toujours avec XDebug, je confirme que ob_start() est appelé avant...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai résolu mon problème.

    Par contre je n'ai pas compris la véritable cause puisque ce qui faisait planter Artichow était en fait une concaténation de chaine à un autre endroit du code. J'ai modifier uniquement cette ligne et le problème d'affichage des graphes à disparu...

    Assez mysterieux...

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Artichow 1.1 pour php5, gestion des erreurs pour image inline.
    Pour ceux comme moi qui aiment bien les images inline.

    Avec Artichow cela peut s'avérer un peu plus compliqué que prévu.

    En effet, en cas d'erreur, la bufférisation est innéficace pour récupérer les données, car la méthode de dessin de l'erreur met fin prématurément au script avec un 'exit' (ce qui provoque le vidage du cache ob sur la sortie standard).

    Donc pour faciliter le développement de mes graphs, j'ai modifié 1 fichier de la bibliothèque Artichow et mes scripts de statistiques.

    Dans la bibliothèque artichow localisez le fichier Image.class.php
    rendez-vous à la ligne 556
    remplacez l'instruction "exit"
    par "throw new Exception()"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      ...
     
      throw new Exception('Artichow Error');
    Ensuite dans vos scripts de statistiques, il faudra enchasser votre code dans un try...catch
    à partir de votre new Graph(); jusqu'au $graph->draw(...);
    éxemple:
    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
     
    <center>DU HTML</center>
    <?php
      include_once('artichow/BarPlot.class.php');
     
    //tableau foireux
     $stats = array('IndexChaine' => 'valeurNonNumériqueErreur');
     
      try {
      ob_start();
      $graph = new Graph(700, 500);
     
      //Cette instruction plante à cause de $stats.
      $plot = new BarPlot($stats);
     
      $plot->title->set($row['titre']);
      $plot->xAxis->setLabelText($keys);
      $plot->setSpace( 5, 5, NULL, NULL);
      $plot->setBarColor( new Color(250, 230, 180) );
      $plot->barShadow->setSize(3);
      $plot->barShadow->setPosition(Shadow::RIGHT_TOP);
      $plot->barShadow->setColor(new Color(180, 180, 180, 10));
     
      $graph->add($plot);  
     
      //on récupère l'image du graph
      $imgdata = $graph->draw(Graph::RETURN_DRAW);
     
      ob_end_clean();
     
      } catch (Exception $e) {
        //on récupère l'image de l'erreur
        $imgdata = ob_get_clean();   
      }
     
      //on affiche l'image généré par artichow !	
      echo '<img src="data:image/png;base64,'.base64_encode($imgdata).'" alt="It doesn\'t work in your browser.">';
     
    ?>
    Voilà ...

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

Discussions similaires

  1. [Artichow] Légende sous Artichow
    Par kcizth dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 27/02/2006, 15h08
  2. Réponses: 8
    Dernier message: 20/01/2006, 13h46
  3. [MySQL] Flux de sortie : ob_start + header
    Par ToxiZz dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/12/2005, 23h56
  4. [Artichow] Installation et utilisation d'un de leurs exemples
    Par matterazzo dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 27/10/2005, 11h21
  5. Login capricieux
    Par Sylvain James dans le forum XMLRAD
    Réponses: 2
    Dernier message: 30/04/2003, 01h46

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