Limitations de la librairie GD ?

Tony73190
Invité n'ayant pas de compte PHPfrance

06 sept. 2008, 19:02

Bonjour tout le monde.
Je rencontre une petite difficulté depuis pas mal de temps. Je n'ai jamais réussi à la résoudre. Aujourd'hui je me suis dit : Allez Tony, demande de l'aide !
C'est avec espoir donc que je m'en remet à vous tous ^^.

Alors voilà, je fais mon petit album photo en ligne. Je met des images, et mes amis peuvent laisser des commentaires, tel un "blog".
Ces commentaires peuvent être "imagés", c'est à dire que chaque personne peut, en plus d'écrire du texte, cliquer sur le fameux bouton parcourir, sélectionner une image de 1Mo maxi (contrôle effectué sur la page de traitement du formulaire), et voilà ! Pour ces commentaires, je me suis pas foulé : au lieu de faire une liaison FTP, je passe en HTTP, truc basique quoi. On en vient au problème :

Quand bien même l'image ne fait que 150Ko (admettons), sur 4 000 000 de pixels (2000x2000), quand on upload le commentaire, la base de donnée se remplie bien, mais l'image ne s'upload pas.
GD intervient dans la page de traitement pour créer une miniature, puis ensuite le script copie les photos dans le répertoire qui va bien.
Pour des tailles "normales" comme 1200x789 pixels, c'est OK.

Ma question donc : n'y aurait-il pas une sorte de bog ou limitation de la librairie GD quand on essaye de lui faire traiter de trop nombreux pixels ?

Tony73190
Invité n'ayant pas de compte PHPfrance

06 sept. 2008, 19:18

Bon, j'ai regardé ce probleme de plus près, j'ai du temps, il pleut donc...
Voici l'erreur :

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 13332 bytes) in /homepages/17/d213990876/htdocs/monmien/site/scripts/fonctions_php/resize_images.php on line 11

A priori, le serveur aime pas que le prenne trop de mémoire à traiter trop de pixels.
Voici mon code de traitement :

Code : Tout sélectionner

$id_rep = @opendir ($repertoire); $size = @getimagesize ($repertoire."/".$fichier); if ($size[1]==0){$size[1]=1;}//eviter les messages affichant l'erreur quand le fichier n'est pas transmit $rapport = $size[0]/$size[1]; $height = $largeur / $rapport; $source_image = imagecreatefromjpeg ($repertoire."/".$fichier); $dest_image = imagecreatetruecolor ($largeur, $height); imagecopyresampled ($dest_image, $source_image, 0, 0, 0, 0, $largeur, $height, $size[0], $size[1]); imagejpeg ($dest_image, $repertoire."/_".$fichier, 75); imagedestroy ($source_image); imagedestroy ($dest_image);
Ca viendrait du imagecreatefromjpeg ... Je cherche et vous tiens informé.

ViPHP
ViPHP | 2287 Messages

06 sept. 2008, 19:56

Bonjour,

Tu peux modifier la valeur memory_limit sur laquelle bute ton script dans ton php.ini ;-)

Tu peux aussi éventuellement utiliser get_image_size() pour renforcer tes contrôles avant validation du fichier uploadé pour refuser les images de taille excessive.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 5924 Messages

06 sept. 2008, 19:57

Ce n'est pas parce que l'image uploadée fait 150Ko que ton traitement ne dépassera pas les 8Mo. En l'occurrence, ici le pb, c'est que l'image est très compressée, et décompressée, elle prendra beaucoup plus de place qu'une image peu compressée. Voilà qui explique qu'il va être très difficile de régler ton problème…

Tony73190
Invité n'ayant pas de compte PHPfrance

06 sept. 2008, 20:26

Hello Tous !
Bon, depuis tout à l'heure je fais une série de tests.
J'ai en effet commencé par augmenter mon memory_limit.
Là, erreur 500... 1&1 aime pas trop ^^
J'ai pas réussi à trouver si 1&1 autorisait cette correction du php.ini.
Bref, j'ai compris que mon problème était sûrement pas facile à résoudre. Du coup, j'ai entamé des tests, à taton.
Voici mes résultats :
2000x2000 : NOK, erreur Allowed memory...
1900x1900 : NOK
1500x1500 : OK
Ceci m'a amené à un autre test : savoir si c'est le nombre de pixels au total qui ne plaît pas à GD ou alors juste une des desux longueurs :
15x150000 : NOK, même erreur.

Pour le moment, je me suis donc résigné à restreindre à 1500px max en largeur et 1500px max en longueur.
Je suis sûr qu'il doit y avoir une solution (serveur dédié ?), mais pour le moment, çà devrait aller.

Disons que le problème d'images, dans un site web, est très récurrent. Entre ce problème par exemple, le chargement de plusieurs images, grosses ou petites, en tâche de fond, et j'en passe.

Je me doute que la solution doit s'appeler Java par exemple... Quand j'aurai le temps alors. Qu'en pensez-vous ?

Dernière question, pour la route.
Quand vous faite de l'upload de fichier via un formulaire, traité par une page PHP, qui initie un transfert via FTP... Cet upload même (votre micro vers serveur), se fait bien en HTTP non ?
La connexion FTP sert juste pour déplacer le fichier temporaire (/tmp/...) vers sa destination finale non ? Je me trompe ?

Merci beaucoup de votre aide. Les questions que je posent là sont une sorte de "bonus", si vous savez pas, c'est pas grave ^^. Merci déjà pour le reste ;)

ViPHP
ViPHP | 5924 Messages

07 sept. 2008, 02:34

Je me doute que la solution doit s'appeler Java par exemple... Quand j'aurai le temps alors. Qu'en pensez-vous ?
Que vient faire Java là dedans ? :shock:
Quand vous faite de l'upload de fichier via un formulaire, traité par une page PHP, qui initie un transfert via FTP... Cet upload même (votre micro vers serveur), se fait bien en HTTP non ?
La connexion FTP sert juste pour déplacer le fichier temporaire (/tmp/...) vers sa destination finale non ? Je me trompe ?
Je ne vois pas l'utilité de faire un transfert FTP juste après un transfert HTTP. Si c'est pour transférer vers un autre serveur, autant uploader directement sur cet autre serveur en FTP… Sinon, à partir du moment où un transfert se fait via une page web, il se fait obligatoirement en HTTP, aucun autre protocole (courant) ne permet de servir des documents au client…
Là encore, quel serait l'intérêt d'utiliser une connexion FTP pour déplacer un fichier sur le même serveur ? Le déplacement de /tmp/ ou n'importe quel dossier du système vers n'importe quel autre dossier se fait par lecture/écriture sur le disque (voire même sans déplacement de données), comme sur tout ordinateur, en quoi serait-ce différent sur un serveur ?
Je me demande si tu as vraiment compris ce qu'était le protocole FTP…