Benim sunucuda GD Kütüphanesi için çok büyük görüntüleri yeniden boyutlandırma

7 Cevap php

Ben hemen hemen her zaman müşterileri için web siteleri (GD kullanarak) bir PHP yeniden boyutlandırma komut dosyası var. Ne olursa olsun ben onları yüklemeden önce kendi dijital kameradan onların büyük 7MP görüntüleri yeniden boyutlandırmak için onlara kaç kez, hala bunu asla. Sonuç sunucudan bir "Out Of Memory" hatası ve orijinal görüntü çözünürlüğü-bilge çok büyük olduğu için görüntü, resized almaz.

Gerçekten büyük görüntüleri yeniden boyutlandırmak için daha iyi bir yolu var mı? Ben bu büyük görüntüleri yeniden boyutlandırmak benim komut dosyası aracılığıyla saplanabilirler bir API sunan bir hizmet var mı?

7 Cevap

Eğer php sayfasından resmi yeniden boyutlandırmak için imagemagick çağırabilir, ancak sistem çağrıları izin verirseniz bir güvenlik o zaman meselesi var

Herhangi bir API Bellek bir çok kullanır, sizin php memory_limit aswell değiştirebilirsiniz.

Eğer PHP yapılandırma mevcuttur ImageMagick API - varsa kullanın! ImageMagick PHPs memory_limit sayılır almaz ve bu nedenle büyük dosyalar ile çalışabilirsiniz.

Eğer gerçekten sunucu üzerinde hiçbir kontrole varsa, hızlı ve çok kötü bir geçici çözüm - $ _POST resim dosyasını aldıktan sonra, ilk olarak ile boyutları kontrol:

<?php
$image_size = getimagesize("yourfile.jpg")
$mem_usage = $image_size[0] * $image_size[1] * 4 //4 bytes per pixel (RGBA)
if ($mem_usage > $mem_aviable) {
    die ('Please upload smaller pic. I tell you that all the time.  '.
         'Resize yout huge 7MP images from your digital camera '.
         'before uploading them.'); //Better put something more polite here.
}

Sen convert kullanarak, örneğin, harici bir program için dışarı kabuk olabilir.

sonra boyutlandırma işi kuyruk onlara yükleyerek hakkında, bir komut satırı php script sonra pick up ve süreç (daha hızlı ve ayrı bir bellek sınırı ve yürütme zaman olabilir) nasıl

Sadece onlar bunu yüklemeden önce onları o küçük boyutlandırmak olun. MAX_FILE_SIZE

Ben bu sorun ile gün (ve gece) takılıp var.

Moreover, providers memory limit differs from one to another. And change the memory_limitin PHP does not work on shared servers, providers usually limit the ram even if phpinfo() says that you got 128Mo (1and1 limits RAM to 60Mo per process for example).

Ama sonunda burada oldukça verimli bir şey bulundu: http://www.imagemagick.org/Usage/files/#massive

Bu imagemagick gerekiyor, ama ben sağlayıcıların çoğu özgün, kendi sunucularında bile paylaşılan olanlar bu sağladığını keşfetti.

exec('env MAGICK_TMPDIR=<tmp_dir> nice -5 convert -limit memory 32 -limit map 32 -resize 800x600 huge.jpg reasonable.jpg'); 

Bu söyleniyor gibi:

  • env MAGICK_TMPDIR=<tmp_dir> set up a temp directory for imagemagick to simulate ram (kind of)

  • nice -5 is also a unix command to change the priority of a process (http://en.wikipedia.org/wiki/Nice_(Unix))

  • convert ... imagemagick komut satırı

Gerçek anlaşma yaklaşık -limit memory 32 ve -limit map 32 olduğunu. Bu (: 32Mo burada) ikili tarafından kullanılan bellek sınırlamak yoludur. Muhtemelen sunucu değerlerini maç değerlere uygun gerekecektir (size Ölümcül Hata verir Genellikle PHP size maksimum ayrılan bellek söyler. Senin konforlu olması için 2 ya da 4 ile bu değeri bölmek öneririm).

Ben de bazı teminat sorunları önlemek için, benim PHP diğer bazı satırları koymak için gerekli:

ignore_user_abort(true); // ignore user abort : let the script finish resizing even if user aborts
set_time_limit(0); // ignore server timeout
putenv('MAGICK_THREAD_LIMIT=1'); // limit the number of thread for the binary. Very important in my case 

Yardımcı olacak tüm umuyoruz ...


convert sizin sunucuda kullanılabilir olup olmadığını bilmek için, (PHP) Bu deneyebilirsiniz:

$out = array();
exec('which convert 2>&1', $out);
print_r($out); 

Varsa o olacak, size ikili yolunu verir.

Ben doğrudan GD kullanılan ayıklama PHP kodu çalışırken biraz zaman geçirdim, ama büyük görüntülerde ve GD yuttum küçük hatalar var gibiydi görüntülerin bir alt kümesi üzerinde başarısız olmuştu.

Ama sonra (http://phpthumb.sourceforge.net/) phpThumb buldum, ve ben asla geri dönmeyeceğim. Benim web dizinine iki PHP dosyalarını ekledikten sonra (phpthumb.class.php ve phpthumb.functions.php) benim küçük oluşturmak için aşağıdaki kodu kullanabilirsiniz başardı:

include("phpthumb.class.php"); 

// Load data into phpThumb object and set parameters
$phpThumb = new phpThumb();
$phpThumb->setSourceData(file_get_contents($_GET['filename']));
$phpThumb->setParameter('w', $width);  // Set width
$phpThumb->setParameter('h', $height); // Set height
$phpThumb->setParameter('zc', 1);      // Specify zoom-crop (instead of stretch)
$phpThumb->setParameter('q', 100);     // Specify quality

// Generate & output thumbnail
$phpThumb->GenerateThumbnail();        // Generate the thumbnail
$phpThumb->OutputThumbnail();          // Output it to browser
$phpThumb->RenderToFile("$thumbname"); // Output it to file
$phpThumb->purgeTempFiles();           // Clean up

Boom, bir cazibe gibi çalışır, oldukça hızlı ve büyük dosyalar ile hiçbir sorunları var. Ayrıca, sunucu üzerinde mevcut ne bağlı olarak, GD veya ImageMagick kullanabilirsiniz, böylece nispeten taşınabilir bulunuyor.