Kullanıcı görüntü yüklenenler işlemek için önerilen mimari

6 Cevap php

Geçmişte, ben iki farklı şekilde kullanıcı görüntü yüklenenler ele ettik:

  • Bir veritabanı tablosundaki görüntü verilerini kaydetmek ve bir PHP komut dosyası aracılığıyla yükleyin
  • Resim yükleyin, HTML etiketleri yoluyla, jpeg bir dizine koymak ve yüklemek için dönüştürmek

İlk seçenek oldukça iyi çalıştı, ama ben yüklenen görüntüler üzerinde oldukça kısıtlayan boyutu kısıtlamaları tutmak zorunda kaldı. İkinci seçenek tür (Ben ancak, bunun yerine ImageMagick kullanarak sabit olabilir düşünüyorum) PHP'nin görüntü kütüphanesi genellikle dosya dönüştürme botch olurdu dışında çalıştı.

Ben artık kullanıcılar bir potansiyel olarak daha büyük ölçekte bir üçüncü kez yapıyorum ile karşı karşıya değilim. Ben zaten yükleme sonra görüntüye bazı düzenlemeler yapmak için ImageMagick kullanarak planlıyoruz. Ben mümkün ve hatta birisi yükler ki her fotoğraf korumak gibi küçük görüntü yüklenenler üzerindeki kısıtlamaları tutmak isterim.

Kullanıcının fotoğraf yüklemeleri yüzlerce seferde küçük resim olarak ekranda olacak zamanlar olacaktır. Bir veritabanında bu saklanması ve her biri için onları çekerek ve PHP ile görüntüleyen gitmek için iyi bir yol gibi görünmüyor, ama tek bir dizin için tüm görüntüleri atma ya yok.

Bu durumda sizin öneri nedir? Eğer yukarıdaki seçeneklerden biri ile gitmek, yoksa farklı bir çözüm var mı?

6 Cevap

Bir veritabanında bu saklanması ve her biri için onları çekerek ve PHP ile görüntüleyen gitmek için iyi bir yol gibi görünmüyor, ama tek bir dizin için tüm görüntüleri atma ya yok.

Bir melez yaklaşım alabilir.

(Eğer uygulama için uygun olduğu belirlemek hangi şema göre) klasörler heirarchy görüntüleri depolamak. Veritabanınızda her görüntünün tam yolunu saklayın.

Ancak gerçek görüntülerden yanında saklanır: Bir arka plan iş, üretilen görüntülerin küçük resimlerini (Imagemagick ile söylemek) olan dosya adları biraz resimlerden kendilerini farklı ('başparmak-' ön eklemek örneğin) var. "Benim küçük resim galerileri yüzden beni de dahil edin, hazır" anlamına gelir her resim için veritabanında bir alan olabilir.

Bir galeri, dilim için bir istek olsun ve veritabanı alanları kullanarak görüntülerin grubu zar, o zaman uygun küçük ve görüntü yollara başvuran HTML bir parça üretmek.


Edit: What Aaron F says is important when you need to handle a very large number of requests. Partitioning of the image / sql data is a good road to scalability. You'll need to look at access patterns in your application to determine where the partition points lie. Something you can do even sooner is to cache the generated HTML for the galleries in order to reduce SQL load.

Bölümleme: Eğer alıntı iki örnek en önemli parçası açıklık yoktur.

örneğin bir veritabanında saklandığı takdirde, görüntüler bir veritabanı sunucusunda, bir tablo tamamen ikamet ediyorsunuz? Veya tablo birkaç sunucuları / kümelerde paylaştırıldı edilir?

örneğin Bir dizinde saklandığı takdirde, tüm görüntüler bir sabit diskinizde ikamet ediyorsunuz? Veya görüntüler kullanıcının oturum açma adına ilk harfine göre [RAID] sürücüler, ayrı eşleştirebilirsiniz?

İyi bir bölümleme şeması ölçeklenebilirlik için gereklidir.

Bildiğim kadarıyla toplu olarak küçük resimlerini görüntüleyerek gibi, muhtemelen burada bazı precomputation isteyeceksiniz. yani küçük oluşturmak (belki de bir ayschronous işi yoluyla, resim yüklenir hemen sonra başladı) ve özel bir sunucu onları sahneye. Bu Youtube yüklenen videoların görüntü anlık yapar nasıl.

Imho, David'in çözümü çoğu için iyi, ama iki ayrıntıları değiştirmek istiyorsunuz:

Veritabanınızda her görüntünün tam yolunu saklayın.

Nedense görüntüleri değişikliklerin dizin, bu senin hayatın biraz karmaşık çünkü eğer ben, sen full yolunu saklamak gerekir sanmıyorum. Sadece dosya depolamak yeterli olmalıdır. Her zaman html doğrudan tam yolu içerebilir.

üretilen görüntülerin küçük resimlerini sahip olan dosya adları biraz görüntülerin kendilerini farklı ama gerçek görüntülerin yanında saklandığı (Imagemagick ile söylüyor).

Ben, farklı bir dizine bir oluşturduğunuz her başparmak için dizin ve tam olarak aynı adı taşıyan küçük resimlerini koymak tercih. Bir keresinde kullanıcı binlerce görüntü ile bir site üzerinde çalıştı ve ben aynı dizine hepsini koymak hata yaptı. Dizin birkaç dakika beklemek zorunda kalmadan bu dizini açmak neredeyse imkansız o kadar çok büyüdü.

PHP'nin görüntü kütüphanesi genellikle dosya dönüştürme bozmak istiyorum

Ben size büyük (2mb +) dosyalarının yükleme izin özel eğer, başparmak oluşturmak komut bellek sınırı artırmak için öneririz.

Sen ini_set('memory_limit', '30M'); ile yapabilirsiniz. Tabii ki, gerçek sayı size kalmış. 30M thumbnail ağır siteleri benim için çalıştı.

Birkaç yıl önce ben sonuçta bazı 340 bin taramalar artı göreli minik saklamak içindir bir intranet görüntü arşivi yazdı. Ben uzun bir klasör listesini yapmak için temel OS sormayın olarak tek bir dizine hepsini dökümü için hiçbir zor neden olduğunu öğrendim etrafında Googling. Diğer bir deyişle, bir ls / dir çağrısında makineyi kapatmak istiyorum ama sadece (veritabanından) adlarına tarafından tek görüntü dosyaları almak hiçbir performans ceza anlamına gelecektir.

Bu arşiv şimdi birkaç yıl için çalışmakta olduğu ve aslında bir klasörde depolanır 60k görüntüleri üzerinde bir şey ile çalışıyor teyit edebilirsiniz.

Ben GD jpeg sorun dönüştürme şeyler her türlü vardı hiç, ama bu belirli bir iş için ben (çoğunlukla çünkü iyi belgelerin) bir yardımcı uzantısı olarak MagicWand ile ImageMagick gitti.

uhm küçük oluşturmak için, phpthumb ... bu konuda kesinlikle mükemmel ... ve birkaç ekstralar var, ama muhtemelen o ihtiyacınız olmayacak kullanabilirsiniz ... otomatik olarak yerel bir önbellek oluşturur Lütfen dosya sistemi, çok kaynak tasarrufu yani ...

i hibrit yaklaşım muhtemelen dosya sistemi ve veritabanı dosya yerle ilgili en ölçeklenebilir, yani mağaza dosyaları, düşünüyorum ... bu şekilde, (yaratıcısı gibi, başlık, etiket, vb) dosyası ile bazı meta verileri saklayabilirsiniz, ve küçük veritabanı tutmak ... artı, (hatta diğer makinelerde, vb) keyfi yerlerde görüntüleri saklayabilirsiniz, böylece kolaylıkla tüm bu yükü dağıtabilirsiniz ...

Bana sorarsanız ben Thumbnailer sınıfını kullanırsınız.