2011-08-17 2 views
1

Erreur fatale: taille maximale autorisée pour la mémoire de 33554432 octets épuisé (essayé d'allouer 4912 octets) dans /var/www/development/example/system/libraries/Image.php en ligne .images reconstruction PHP: utilisation de la mémoire

L'image JPEG en question n'a pas une taille de fichier particulièrement grande (741 Ko). Nous avons utilisé ce même code pour reconstruire des images plus grandes. Cependant, l'image a des dimensions inhabituellement grandes (4912px x 3264px). Cela aurait-il un effet?

Qu'est-ce qui détermine l'utilisation de la mémoire lorsque PHP reconstruit une image? Est-ce juste la taille du fichier? Les dimensions? La densité de couleur? Le type de fichier?

La ligne sur laquelle il était cassé

$f1 = 'imagecreatefrom' . $tag; 
$src = $f1($file); 

Je pense que ce contexte assez. Il n'a pas été aussi loin que d'essayer de reconstruire l'image. Le charger dans la mémoire était suffisant pour le casser.

+0

Qu'est-ce que vous utilisez pour construire les images? gd, GraphicsMagick, ImageMagick, ou autre chose? – Carpetsmoker

+0

Cela dépend, je suppose. Pouvons-nous voir le code dont parle l'erreur? – Bojangles

+0

Directive memory_limit' php.ini. Vous l'avez réglé à 32Mb.Si je ne me trompe pas, c'est la valeur par défaut pour le serveur de production. En ce qui concerne l'utilisation de la mémoire - Je suis d'accord avec les commentaires ci-dessus, cela dépend de ce que vous utilisez pour le construire. – J0HN

Répondre

2

Comme l'a dit Ricky, augmentez la limite de mémoire si vous le pouvez. Notez également que les dimensions sont plus importantes que la taille du fichier (car la taille du fichier est pour une image compressée). Lorsque vous ouvrez une image dans GD, chaque pixel reçoit 3-4 octets qui lui sont alloués, RGB et éventuellement A. Ainsi, votre image 4912px x 3264px doit utiliser 48,098,304 à 64,131,072 octets de mémoire, plus les frais généraux et toute autre mémoire script utilise.

+0

Bon commentaire, mais je pense que vous devriez utiliser bpp (bits par pixel) au lieu de RVB (A) car il y a beaucoup de formats différents pour représenter la couleur des pixels. Juste nitpicking. – XzKto

+0

J'ai rencontré ce genre de problème auparavant et les gens ont tendance à mieux saisir RGB (A), mais les bits par pixel sont plus corrects, et probablement plus précis. – steveo225

1

Augmentez votre taille de la mémoire tampon

php_value memory_limit 64M dans votre .htaccess

ou ini_set('memory_limit','64M'); dans votre fichier php

0

Cela dépend de votre implimentation. la dernière fois que je travaillais sur un fichier csv avec plus de 500 000 enregistrements, j'ai reçu le même message. Plus tard, je présente des cours et j'essaie de fermer les objets ouverts. il réduit la consommation de memeory. si vous ouvrez une image et l'éditez. cela signifie qu'il se charge dans une mémoire. dans ce cas, la taille importe vraiment. si vous utilisez plusieurs images. Je vais enregistrer à un par image et ensuite fermer cette image. Dans mon expérience lorsque je travaillais sur des fichiers d'illustrations pdf pour vérifier les marques de coupe. J'avais la même erreur.

//you can set the memory limits values 
// in htaccess 
php_value memory_limit 64M 
//or in you using following in php 
ini_set('memory_limit', '128M'); 
//or update it in your php.ini file 

mais si vous optimisez votre code. et utilisez l'approche orientée objet alors votre consommation de mémoire sera très inférieure. parce que chaque objet a sa propre portée et hors de ce cadre il est détruit.

0

La taille de la mémoire utilisée dépend de la dimension et de la profondeur de couleur. J'ai aussi été confronté à ce problème il y a quelques années, alors que je construisais un portfolio pour les photographes. La seule façon de résoudre correctement ceci est de passer votre bibliothèque d'images de GD à imagick. Imagick consomme beaucoup moins de mémoire et n'est pas lié à la limite de la mémoire PHP.

Je dois dire que les images téléchargées par les photographes étaient jusqu'à 30MP. Et définir la limite de mémoire à plus de 1024 Mo n'a pas de sens à mes yeux.