PHP GD İzin bellek boyutu tükendi

3 Cevap php

Ben PHP kullanarak JPEG görüntülerin bir dizin (50k dan 500k kadar kabaca 600 +) işlemek için çalışıyorum: yeniden boyutlandırmak ve görüntüleri kaydetmek için GD ama oldukça erken sürecini sekteye biraz isabet ettik. Sonra doğru sadece 3 görüntüleri (30K, 18K ve 231K) işlem bir Allowed memory size of 16777216 bytes exhausted PHP Ölümcül hata olsun.

Ben görüntüleri ile bisiklet ve aşağıdaki kodu arıyorum:

    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);

Ben imagedestroy fonksiyonu ile belleği boşaltmak için denedim ama herhangi bir etkiye sahip görünmemektedir. Komut sadece sürekli kod imagecreatefromjpeg çizgisinde boğulma tutar.

Ben php.ini kontrol ve doğru tutuyor gibi memory_limit = 16M ayar görünüyor. Bellek doluyor Ama neden ben çözemiyorum. Geri çöpçüyle belleği serbest gerekmiyor mu? Gerçekten memory_limit ayarını artırmak istemiyorum. Bu potansiyel gelecekte daha fazla sorunlara yol açabilecek kötü bir çözüm gibi görünüyor.

Bilginize: Ben bir komut isteminden benim komut koşuyorum. Bu işlevselliği etkilemez ama ben bunu belirtmek gerektiğini düşündüm bu yüzden yanıtı etkileyebilir.

Ben sadece basit veya burada bir tasarım kusuru varsa bir şey eksik ise herkes görebilir miyim? Bu oldukça basit bir görev olacağını düşünmek istiyorum. Elbette bu mümkün olmalı, değil mi?

3 Cevap

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

sorun çözüldü

Bu görüntülerin bir veya daha fazla aslında ham bellek 16M şişirmek mümkündür. Kontrol etmenin bir yolu, Photoshop veya Irfanview açın ve renk alanını ve piksel boyutlarını kontrol etmektir.

Bu 16M ulaşmak için çok almaz, örneğin, bir "asılıyor" 6 megapiksel kamera düşünün. 2048 piksel görüntü tarafından 3072 piksel oluşturur. Renk (RGB) başına bir bayt ham boyutu:

3072 x 2048 x 3 = 18.874.368

Yani, işlemek için beklediğiniz büyük görüntülere göre bellek artırmak isteyebilirsiniz. Ama onların ham boyutunu göz önünde bulundurmanız gerekir.

Basitçe ini_set(); kullanmak ve istediğiniz boyutu ne olursa olsun memory_limit ayarlayın.