PHP GD Dimensione della memory consentita esaurita

Sto cercando di elaborare una directory di immagini JPEG (circa 600+, che vanno da 50k a 500k) usando PHP: GD per ridimensionare e salvare le immagini, ma ho subito un po 'di difficoltà all'inizio del process. Dopo aver correttamente elaborato solo 3 immagini (30K, 18K e 231K) ottengo una dimensione di memory permessa di 16777216 byte esaurito errore fatale di PHP.

Sto andando in bicicletta attraverso le immagini e chiamando il codice qui sotto:

list($w, $h) = getimagesize($src); if ($w > $it->width) { $newwidth = $it->width; $newheight = round(($newwidth * $h) / $w); } elseif ($w > $it->height) { $newheight = $it->height; $newwidth = round(($newheight * $w) / $h); } else { $newwidth = $w; $newheight = $h; } // create resize image $img = imagecreatetruecolor($newwidth, $newheight); $org = imagecreatefromjpeg($src); // Resize imagecopyresized($img, $org, 0, 0, 0, 0, $newwidth, $newheight, $w, $h); imagedestroy($org); imagejpeg($img, $dest); // Free up memory imagedestroy($img); 

Ho provato a liberare la memory con la function imagedestroy ma non sembra avere alcun effetto. Lo script continua a soffocare costantemente imagecreatefromjpeg row di codice imagecreatefromjpeg .

Ho controllato il php.ini e l'impostazione memory_limit = 16M sembra che sia tenuta correttamente. Ma non riesco a capire perché la memory si sta riempiendo. Non dovrebbe rilasciare la memory al garbage collector? Non voglio davvero aumentare l'impostazione memory_limit. Sembra una soluzione alternativa che potrebbe portre a ulteriori problemi in futuro.

A proposito: sto eseguendo il mio script da un prompt dei comandi. Non dovrebbe influire sulla funzionalità ma potrebbe influenzare la tua risposta, quindi ho pensato di whererlo menzionare.

Qualcuno può vedere se mi manca qualcosa di semplice o se c'è un difetto di progettazione qui? Penseresti che questo sarebbe un task abbastanza semplice. Sicuramente questo deve essere ansible, giusto?

 ini_set('memory_limit', '64M'); 

problema risolto

È ansible che una o più delle tue immagini si gonfino effettivamente a 16 M nella memory grezza. Un modo per controllare è aprirlo in Photoshop o Irfanview e controllare lo spazio colore e le size dei pixel.

Ad esempio, non ci vuole molto per raggiungere i 16M, considerando una camera "lowly" da 6 megapixel. Crea un'image di 3072 pixel per 2048 pixel. A un byte per colore (RGB) la dimensione non elaborata è:

3072 x 2048 x 3 = 18,874,368

Quindi, potresti voler aumentare la memory in base alle immagini più grandi che ti aspetti di elaborare. Ma devi considerare la loro dimensione originale.

In alcuni casi non è ansible anticipare la massima allocazione di memory necessaria per le immagini che si stanno elaborando. Per evitare un arresto anomalo, puoi includere i seguenti comandi prima e dopo il ciclo:

 register_shutdown_function ('my_function'); $mem_limit = ini_get ('memory_limit'); ini_set ('display_errors', false); ini_set ('memory_limit', '400M'); // some high value 

(… il tuo process …)

 ini_set ('memory_limit',$mem_limit); 

E posiziona all'interno della function "my_function ()" il codice che gestirà l'arresto anomalo.

Basta usare ini_set(); e imposta memory_limit su qualsiasi dimensione desideri.