Bellek çalışan GD resim kütüphanesi önlemek için bir fail-safe yolu?

6 Cevap php

Bellek çalışmasını PHP GD image library önlemek için bir yolu var mı? Çok büyük bir görüntü yüklenirse, GD komut dosyasını sonlandırıp, bellek tükendi eğilimindedir. Ben o uzatmak için bir catchable istisna veya bir şey atmak istiyorum, ama ne yazık ki öyle değil ediyorum.

Ben genellikle tüm hazırım çalışır eğer Sağ şimdi, ilk olarak bir ini_set('memory_limit', '128M') sorunları Arnavut kaldırımlı bir araya komut dosyası kullanıyorum. Mümkün olmayabilir ama sunucu yapılandırmasına bağlı olarak, bu yüzden gereken bellek miktarını tahmin etmeye çalışır bir algoritma geri düşüyorum (çözünürlük, renk derinliği, kanalları ve dikkate geçiştirmek faktör alarak), sonra onu karşılaştırır fonksiyonu varsa memory_get_usage(), aksi halde kaba bir tahmin yok.

Her şey bugüne kadar çalışır, ama o kadar şık olmaktan ve bazı kenar durumlarda başarısız olacaktır, eminim. Bunu yapmak için daha iyi bir yolu var mı bunun için varsa, yani GD yerine durdurmak için her şeyi taşlama, incelikle başarısız mı?

6 Cevap

Daha fazla bellek satın! :-P

Cidden, o sizi herhangi bir eylem daha fazla bellek gerektirir çünkü bellek olmanın işlemek mümkün değildir.

En iyi bahis görüntü geçerli bellek ayarlara dayalı yüklenen olma boyutunu sınırlamak için.

Yapabileceğiniz en iyi şey ihtiyacınız olacak ne kadar ram anlamaya çalışıyorum durdurmak için, ve başlangıçta dışarı sadece max - kullanılabilir 4 GB varsa, görüntü komut 2 ve 4 GB ya da öylesine arasında kullanmanız söyle ve ne zaman tüm potansiyel olarak ölümcül durumları kapalı kapsayacak, normale dönmek var script, biter. Ben yine de aklınıza sadece "Fail-safe" yolu ...

Orada bunu yapmak için başka bir yoldur, ancak bu resim düzenleme sürecinin gibi bazı parçaları bir kaç kez tekrarlanan olacağını, zaman alıcı olabilir, ama görüntüyü işlemek için deneyin, sonra tahmini değeri bellek limitini ayarlayabilirsiniz Bu durum yakalamak başarısız olursa, bellek sınırı artırmak, sonra tekrar görüntü işleme - Eğer belli bir bellek sınırı başarılı ya ulaşana kadar bu yinelenen - onların resim çok büyük olduğunu açıklayan kullanıcıya bir hata mesajı atmak istiyorum bu noktada kullanılmalıdır.

Edit: out-of-bellek hatası yakalamak için, bu çözümü kullanabilirsiniz: http://au2.php.net/set_error_handler#35622

Eğer bir görüntü oluşturduktan sonra.

imagepng($image);
imagedestroy($image);

Bellek sorunu kaldırmak olacak

PHP'nin ölümcül hataları yakalamak için, gibi "bellek yetersiz" veya "PHP Fatal error: tükenmiş 8388608 bayt İzin bellek boyutu (ayırmaya çalıştı ... byte)", buraya bakın: http://php.net/manual/en/function.set-error-handler.php#88401

Ne kadar bellek, her gd function ihtiyacını kontrol etmek için bazı testler yapmak.

  • imagecreatetruecolor ihtiyacı var gibi görünüyor width*height*5 bytes.

  • imagepng ihtiyacı var gibi görünüyor width*height*4 bytes.