Bonjour,

J'utilise la librairie imagine pour le traitement de mes images. Tout fonctionne correctement, mais maintenant je n'arrive plus à afficher mes images j'ai l'erreur suivante :

Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 39923713 bytes)
File: phar:/imagine.phar/Gd/Image.php
Line: 2
Notice: If you want to customize this error message, create app/View/Errors/fatal_error.ctp

Voici le code que j'ai récupérer sur un tuto.

public function image($image, $width, $height, $options = array()){
$options'width'] = $width;
$options'height'] = $height;
return $this->Html->image($this->resizedUrl($image, $width, $height), $options);
}

public function resizedUrl($image, $width, $height){
$this->pluginDir = dirname(dirname(dirname(__FILE__)));
$image = trim($image, '/');
$pathinfo = pathinfo($image);
$dest = sprintf(str_replace(".{$pathinfo'extension']}", '_%sx%s.jpg', $image), $width, $height);
$image_file = WWW_ROOT . $image;
$dest_file = WWW_ROOT . $dest;

// On a déjà le fichier redimensionné ?
if (!file_exists($dest_file)){
require_once 'phar://' . 'imagine.phar';
$imagine = new Imagine\Gd\Imagine();
try{
//$angle = $this->__getRotation( $image_file ); // This method doesn't work for everyone
$angle = 0;
$imagine->open($image_file)->rotate( $angle )->thumbnail(new Imagine\Image\Box($width, $height), Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND)->save($dest_file, array('quality' => 60));
} catch (Imagine\Exception\Exception $e) {
$alternates = glob(str_replace(".{$pathinfo'extension']}",".*", $image_file));
if(empty($alternates)){
return '/img/error.jpg';
}else{
try{
$imagine->open($alternates[0])->thumbnail(new Imagine\Image\Box($width, $height), Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND)->save($dest_file, array('quality' => 60));
} catch (Imagine\Exception\Exception $e) {
return '/img/error.jpg';
}
}
}
}
unset($image);
return '/' . $dest;
}

J'ai essayé ini_set('memory_limit', 400); //J'ai essayé toutes les valeurs possibles lol

Quelqu'un pourrait-il me renseigner ?

Merci

Mickael

4 réponses


Dans ton php.ini, dé commente ou si tu ne l'as pas, ajoute cette ligne :

// Désactive la limite
memory_limit=-1
// Set la limite à 128M par example
memory_limit=128M

J'ai eu le même souci en utilisant le plugin Media mais en essayant ce que tu as fais ça ne marche pas, tu dois changer cette valeur directement dans le *.ini

Sooner
Auteur

Malheuresement,sur mon hébergeur il m'est pas possible de changer cette valeurs :(

Pourquoi cela consomme autant de mémoire ? La mémoire se libère pas bout d'un moment ?

Quelqu'un connait-il une autre solution moins gourmande ?

Sooner
Auteur

Bonjour,

Je me permets de re-poster quelques informations.

Sachant que dans mon application il va y avoir beaucoup d'images de différentes tailles et sachant qu'avec mon hébergeur je suis limité.

Que me conseillez-vous :

Limiter les images à environ 1Mo ? Car actuellement j'ai des images à 3.5 MO
Utiliser une autre librairie que imagine pour le traitement de mes images ?

Merci

Salut,

J'ai eu le même problème la fonction thumbnail demandant extrêmement de ressources j'avais la même erreur et ceux même en local... en local je pouvais changer la valeur de la limite donc c'était pas un problème mais en ligne vu que c'était un serveur mutualisé 1&1 c'est la galère...

J'ai fait une classe Imagine avec les libs les plus récentes, et au lieu d'utiliser la fonction thumbnail j'ai utilisé la fonction resize qui fonctionne à merveille quoiqu'un peu longue mais au moins ça fonctionne...

Donc en arguments la fonction prends une taille venant de l'interface Box en gros tu laisses l'argument $size et prends un second argument qui est un filtre qui doit forcément être mis sur 'undefined'.
Au moins j'ai ma fonction qui fonctionne sur le mutualisé en dédiée je passerai par thumbnail qui semble bien plus rapide.

Après tout dépend de la résolution des images.
Thumbnail fonctionne très bien sur des images pas très grande tandis que resize fonctionne sur un large type de résolution.