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} 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} 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 Code : <?php 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:
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 |