PHP Bellek Sınırı 25MB Bitkin - Dosya Yükleme / Bitki / yeniden boyutlandırma

5 Cevap php

Ben 10MB kadar dosyalar için komut dosyası yeniden boyutlandırmak / tek bir resim yükleme / kırpma kullanıyorum.

Sınarken, ben 25M için php_ini hafıza limitini ayarlamış ve sadece 1.4MB hakkında bir dosya yüklenirken o bitmiştir.

"Allowed memory size of 26214400 bytes exhausted (tried to allocate 10368 bytes)"

Bu bana garip geliyor, 10368 değil < 26214400? (Retorik Soru)

Ya da ben 25MB üzerinde 10368 bayt gitmiş demek? Benim komut dosyası bu kadar bellek kullanıyor olmalıdır?

Kod:

function make_thumbnails($updir, $img)
{
    $thumbnail_width    = 200;
    $thumbnail_height   = 150;
    $thumb_preword  = "thumb_";

    $arr_image_details  = GetImageSize($updir.$img);
    $original_width = $arr_image_details[0];
    $original_height    = $arr_image_details[1];

    if( $original_width > $original_height ){
        $new_width  = $thumbnail_width;
        $new_height = intval($original_height*$new_width/$original_width);
    } else {
        $new_height = $thumbnail_height;
        $new_width  = intval($original_width*$new_height/$original_height);
    }

    $dest_x = intval(($thumbnail_width - $new_width) / 2);
    $dest_y = intval(($thumbnail_height - $new_height) / 2);

    if($arr_image_details[2]==1) { $imgt = "ImageGIF";  $imgcreatefrom = "ImageCreateFromGIF";  }
    if($arr_image_details[2]==2) { $imgt = "ImageJPEG"; $imgcreatefrom = "ImageCreateFromJPEG";  }
    if($arr_image_details[2]==3) { $imgt = "ImagePNG";  $imgcreatefrom = "ImageCreateFromPNG";  }

    if( $imgt )
    {
        $old_image = $imgcreatefrom($updir.$img);
        $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
        imageCopyResized($new_image,$old_image,$dest_x,
        $dest_y,0,0,$new_width,$new_height,$original_width,$original_height);
        $imgt($new_image,$updir.$thumb_preword.$img);

        // Added by your suggestions:
         imagedestroy($old_image);
         imagedestroy($new_image);
    }
}

5 Cevap

Hata mesajı başka 10368 bayt ayırmaya çalıştı söylüyor, ancak mevcut değildi. Başka bir deyişle, 25MB havuz bitkin ve komut gerekli 10368 bayt ayıramadı.

Aşağıdakine benzer bir satır ekleyerek ya da güncelleyerek, sizin php.ini dosyasında bu sınırını artırabilirsiniz:

memory_limit = 64M

Bildiğim kadarıyla "25MB yeterli ise," bu bize cevap için zor bir soru gibi ... Oradaki meşru daha fazla 64MB ihtiyaç ya da bazı komut dosyaları kesinlikle vardır. Eğer sürekli bellek havuzu boyutunu artırmak zorunda olduğunu fark ederseniz, o kadar çok yer alıyor ne içine bakarak başlamak istiyorum.

Here is a related question sizin bellek havuzu boyutu bazı iyi bir tartışma vardır.

EDIT kod yayınlanmıştır görünce, bu görüntülerle çalışırken bellek büyük miktarda tüketmek kesinlikle mümkündür. Sen imagedestroy bir görüntü kaynağı ile yapılır sonra arayarak komut yardımcı olabilir.

Zaten söylenmiştir ne ek olarak:

(JPEG) gibi sıkıştırılmış dosya biçimlerini işleme gerçek dosya boyutu çok daha fazla bellek ihtiyacı olduğunu asla unutmayın. Bir 3000 x 3000 Pixel JPG dosya sadece 500kb ağır olabilir, ama gerektirir (kabaca) 3000 x 3000 x 3 (Tek Kırmızı, Yeşil ve Mavi için byte, her biri ve hatta bir daha Alpha moduna bağlı olarak) = en az 27 MB .

Ya da ben 25MB üzerinde 10368 bayt gitmiş demek?

No Betiğiniz 10368 byte, 10368 + alreadyallocated> 25MB ayırmaya çalışıyordu

Benim komut dosyası bu kadar bellek kullanıyor olmalıdır?

Eğer yeniden boyutlandırma için GD kullanıyorsanız, evet. Ben görüntü işleme için diğer kütüphanelere ya da konsol araçlarını kullanmak denemek istiyorum, daha perfomance verebilir. Ve, kamu web sitesi ise, just-in-time görüntüleri yeniden boyutlandırmak görüntü işleme için bir kuyruk kullanmak ve karar verebilir

Yani sınırını aştı anda, script 10368 bayt ayırmaya çalışıyordu ama başarılı olamadı demektir. Yani 26MB sınırı artırmak eğer artık bu sorun olmayacak anlamına gelmez. Hata daha ileri noktada oluşabilir. Eğer artık bu hatayı alamadım kadar küçük adımlar (örn. 32MB, 48MB,) onu arttırmak için deneyebilirsiniz.