JeuWeb - Crée ton jeu par navigateur
php image corrupt or truncated - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : php image corrupt or truncated (/showthread.php?tid=6725)

Pages : 1 2


php image corrupt or truncated - starmindfr - 21-03-2013

Bijour

Nouveau probleme qui me tracasse depuis plusieurs jours :

A noter qu'avant migration du jeu d'un serveur a l'autre je n'ai jamais eu ce probleme

- Je retouche des images .png avec des scripts et fonctions telles que *

imagecreatefrompng
imagearc

et je termine par

imagepng($image,$tempimg,9);
imagedestroy($image);


Hors de temps en temps, genre 1 fois sur 5 j'ai le bas de l'image qui n'est pas affiché dans le browser, et le message d'erreur "image corrupt or truncated"

Si je fait "ouvrir la cible" j'ai en effet l'image sans le bas, mais si je la re télécharge avec F5 l'image est complete (donc sans aucun script, telechargement direct)


Enfin a noter que j'utilise une variable avec un md5 pour des problemes de refresh ce qui donne une url 18.png?v=1363854008

Et j'affiche l'image dans un cadre avec un scroll jquery :

Code :
<div id="scrollz5" class="carteg">{if $redir ne 2}
<IMG border=0 src="{$imgplayer}?v={$md5}" alt="chargement..."  height="1200px" width="1200px" />{/if}</DIV>

Voili voila donc tout ca fonctionne bien sur l'ancien système, mais pas le nouveau, entre temps les seules modifications qui me viennent a l'esprit sont des problèmes d'encodage utf-8 / asci et le header de la page globale.


RE: php image corrupt or truncated - Xenos - 21-03-2013

Je pense plutôt que, si "cela marche pas direct mais ca marche après F5", le nouveau serveur est plus lent que l'ancien. Au moment où la page HTML demande l'image, celle-ci n'a pas du être entièrement sauvegardée par le serveur, et il manque le base de l'image.
Normalement, il n'y a pas besoin de rajouter un MD5 en fin de nom d'image, car lorsque html demaned l'image, il questionne le serveur (en-têtes HTTP) et lui demande si l'image a changée de <insérer la date de dernière visite de l'image>. Or, comme tu as sauvegardée l'image, celle-ci a changée, et le serveur répondra "oui", donc le client html retéléchargera.


RE: php image corrupt or truncated - starmindfr - 21-03-2013

non justement sans la variable j'ai systématiquement l'ancienne image mise en cache, et comme j'affiche une carte des positions capturée elle n'est donc pas a jour... alors qu'en allant voir sur le disque j'ai bien la nouvelle image. Et j'ai du mettre un MD5 car si la variable ne change pas, l'image est mise a jour 1 seule fois.

Pour la vitesse en effet j'ai l'impression que la page termine son chargement et coupe l'image avant la fin

en fait il faut peut etre que je modifie le type d'appel (actuellement windows load)

Code :
<div id="scrollz5" class="carteg">{if $redir ne 2}
<IMG border=0 src="{$imgplayer}?v={$md5}" alt="chargement..."  height="1200px" width="1200px" />{/if}</DIV>

<script>
    (function($){
        $(window).load(function(){
          $("body").niceScroll();
$("#scrollz5").niceScroll({ cursorcolor:"#0000FF",cursoropacitymax:0.6,cursorwidth:8,touchbehavior:true });
        });
    })(jQuery);
</script>



RE: php image corrupt or truncated - niahoo - 21-03-2013

GD a du mal avec les images grandes (genre plus de 1000px). Tu as peut-être un problème de mémoire, mais vu que l'image est chargée (puisqu'on en voit le début) je ne vois pas pourquoi ça planterait pendant la création.

Peux-tu tester si tu as le même problème avec des images plus petites ?


RE: php image corrupt or truncated - starmindfr - 21-03-2013

je vais regarder mais je pense que la piste du temps de calcul est la bonne, le systeme continue probablement la creation / modification de l'image alors que php commence deja a la chargent, je vais essayer de coller un delai avant de la charger si je trouve comment...


RE: php image corrupt or truncated - niahoo - 21-03-2013

Quand ton script crée l'image, tu peux envoyer l'image au navigateur sans l'enregistrer sur le disque. Ce serait mieux je pense : Tu demandes l'enregistrement sur le disque pour les prochaines requêtes, mais pour la requête en cours tu envoies directement le contenu, sans délai.


RE: php image corrupt or truncated - starmindfr - 21-03-2013

tu veux parler de ce genre de code ? j'ai essayer mais ca me donne l'image en mode texte sur le fond de page et la bonne image dans son cadre, pas evident a integrer vais devoir bidouiller pour savoir si ca marche Smile
Code :
<?php
  header("Content-Type: image/png");

  # Generate cachefile for image, if it doesn't exist
  if( !file_exists($cachefile) ) {
    $im = generateimage();     # some code generates an image resource
    imagepng($im, $cachefile); # store the image to cachefile

    # don't output it like this:
    /* imagepng($im);*/
  
    imagedestroy($im);
  }

  $fp = fopen($cachefile, 'rb'); # stream the image directly from the cachefile
  fpassthru($fp);
  exit;
?>

j'ai trouver une chose sinon , en mettant la compression a 0 l'image passe de 300 kb a 4MO mais elle se chargent entierrement , si je remet 6 ou 9 elle est de nouveau de temps en temps incomplete :
ex avec 6 de compression
imagepng($image,$tempimg,6,NULL);


RE: php image corrupt or truncated - niahoo - 21-03-2013

Ah ben ils te disent l'inverse de moi ...


RE: php image corrupt or truncated - starmindfr - 21-03-2013

en fait avec 1 en compression au lieu de 9 ca réduit tres fortement le problème, ca le fait encore mais beaucoup moins...


RE: php image corrupt or truncated - Xenos - 21-03-2013

Citation :non justement sans la variable j'ai systématiquement l'ancienne image mise en cache, et comme j'affiche une carte des positions capturée elle n'est donc pas a jour... alors qu'en allant voir sur le disque j'ai bien la nouvelle image. Et j'ai du mettre un MD5 car si la variable ne change pas, l'image est mise a jour 1 seule fois.

je pense que cela rejoint ce que je t'ai dit: au moment où le client voit qu'il a besoin de l'image, il demande au serveur si celle-ci a été modifiée, et comme le serveur n'a pas fini d'enregistrer l'image à cet instant, il répond que l'image n'est pas modifiée, et donc, le client ne la retélécharge pas.
La variable avec le md5 n'est qu'un by-pass du problème sous-jacent, qui ne résoud pas ledit problème.

L'histoire de la compression va également dans ce sens: la compression fait perdre du temps en calculs intermédiaire, mais fait gagner de la place. Pas de compression = image sauvée plus vite = image prête avant que le client ne la demande.

Je pense que tu devrais isoler l'image et le code qui la génère.
Plutôt que de générer l'image dans la page web, isole le code générant l'image dans un fichier PHP séparé, appellons-le "image-maker.php".
Dans la page web, tu n'appelles pas "image.png", mais "image-maker.php".
Dans ton image-maker.php, tu génère l'image, puis tu la sauvegarde sur le disque. En même temps que cette sauvegarde, tu renvoies l'image calculée au navigateur (header('Content-Type=image/png'); + imagepng($ressource)). Tu peux ajouter un test conditionnel, au début du script, qui va directement rediriger le client vers l'image png si celle-ci n'a pas besoin d'être mise à jour.

Ce système permet:
  • De faciliter la maintenance, en séparant le code de la page web du code de génération de l'image
  • De bénéficier du cache du client, lors de la redirection vers l'image enregistrée
  • De ne pas faire poireauter le client pendant l'enregistrement de l'image sur le disque, puisque cette image est également renvoyée au client
  • De se passer, normalement, du md5

Tu peux, enfin, ajouter un test conditionnel dans l'image-maker.php qui va faire attendre le client (sleep()) tant que l'image n'est pas sauvegardée, pour éviter les collisions