PHP MySQL görüntüleri depolamak ya da olmamak?

13 Cevap php

Kullanıcıların ilk onlar giriş yaptıktan sonra, onların "profil" bir parçası olarak küçük bir resmini gösteren niyetinde oturum gerekir PHP küçük bir web uygulaması inşa etmişlerdir.

I will have to ensure the image is below a particular size to conserve space, or ensure it is a particular resolution, or both, or even perhaps use something like image magick to scale it down.
Not sure what the best approach for that is yet, any ideas welcome.

Also, I have been trying to work out if it is better to store the image in the users table of MySQL as a blob, or maybe a separate images table with a unique id, and just store the appropriate image id in the users table, or simply save the uploaded file on the server (via an upload page as well) and save the file as theUsersUniqueUsername.jpg. Best option?

I found a tutorial on saving images to mysql here: http://www.phpriot.com/articles/images-in-mysql

Ben sadece bir hobi programcı değilim, ve daha önce hiç böyle bir şey yapmadım, yani örnekler ve / veya detay bir sürü büyük beğeni topluyor.

13 Cevap

Her zaman bir bağlam bağlıdır, ancak genellikle, ben /content/user/{user_id}.jpg adında bir klasör dosya sisteminde bir kullanıcı görüntü saklamak ve mümkün olduğunca az veritabanını rahatsız deneyin.

Ben bir dosya olarak görüntü depolama tavsiye ve daha sonra veritabanı dosyası URI olurdu. Eğer veritabanındaki tüm görüntüleri depolamak ise, daha sonraki bir tarihte ölçeklendirme ile bazı sorunlar olabilir.

Çıkış this answer çok:

SQL Server için Microsoft'un tavsiye veritabanı bağlantıları ile, hız ve boyut için, dosya sisteminde mağaza görüntüleri için kullanılır. Ben onların tercihinin biraz yumuşadı düşünüyorum, ama bu veritabanında hiç yer alacak beri ben hala, o boyutu için kesinlikle daha iyi bir fikir düşünün.

BLOB kullanarak havai çoğu insan size doğru kurmak, özellikle inanmak olurdu çok daha azdır. Sadece ikili dosyaları depolamak için DB çalıştıran ayrı bir sunucu kullanıyorsanız o zaman aslında tüm hiçbir dosya sistemini kullanan ve dosya sisteminden herhangi bir yükü önleyebilirsiniz

Bu sizin kendinize sunucuların bir çift var olmadıkça kolay / en iyi yolu dosya sisteminde saklayarak olduğunu söyledi

  • Do not store the absolute URL of the file in your DB, just the unique part (and possibly a folder or two), e.g. 2009/uniqueImageName.jpg or just uniqueImageName.jpg. Then in your pages just add the host and other folders onto the front, that way you have some flexibility in moving your images - all you'll need to change is a line or two in your PHP/ASP.NET page.

  • Güvenlik için belge kök dışında depolamak için gerek yoktur - .htaccess ALL inkar dosyası aynı iş ve daha fazla esneklik sağlayacak

  • No need to 'shunt' images so much for security, just have a getImage.php page or something, and then instead of inserting the actual URL in the src of the image, use something like getImage.php?file=uniqueImageName.jpg. Then the getImage.php file can check if the user is authorised and grab the image (or not).

  • Saklarken (tercihen tamsayı yani birincil anahtar) benzersiz olması için garantili bir ad kullanın, bazı dosya sistemi (örneğin Windows) harf duyarsız, bu yüzden JoeBloggs.jpg ve joebloggs.jpg vardır veritabanı için değil, dosya sistemi için benzersiz yüzden bir başka üzerine yazılır.

  • Görüntüler için ayrı bir tablo kullanın ve kullanıcıların tablodaki resmin birincil anahtarı saklamak. Hiç fazla alan eklemek veya gelecekte değişiklik yapmak istiyorsanız daha kolay olacak - bu da iyi bir uygulamadır.

SEO ve bunun gibi şeyler hakkında endişeli iseniz, yükleme zaman, daha sonra (örneğin alt etiketi gibi) çıktı bu kullanabileceğiniz başka bir alandaki görüntünün orijinal dosya adını depolar.

Challenging the Conventional Wisdom!

Tabii ki bağlam bağımlı, ama ben bir MySQL veritabanı (ortalama büyüklüğü = 2MB) blob olarak depolanan görüntülerde ve belgelerin binlerce çok büyük bir uygulama var ve uygulama 256MB bellek ile bir sunucu üzerinde iyi çalışır. Gizli doğru veritabanı yapıdır. Her zaman dosya hakkında temel bilgileri depolayan biri iki ayrı tablo, tutmak, ve diğer tablo sadece erişim için blob'u artı bir birincil anahtar içermelidir. Tüm temel sorgular detayları tablo karşı çalıştırmak olacaktır, ve dosya aslında gerektiğinde diğer tablo sadece erişim ve performans son derece iyi yani bir dizinlenmiş anahtarı kullanarak erişebilirsiniz.

Veritabanında dosyalarını depolamak avantajları çok yönlüdür:

  1. Eğer dosya sistemini yedeklemek gerek yok gibi çok daha kolay yedekleme sistemleri, gerekli
  2. Dosya güvenliği Kontrol (evet, bir halka açık olmayan dizinde dosya depolamak ve bir komut dosyası okumak ve dosyayı kusturmak var, ancak performans fark daha hızlı olmayacak olabilir ikiliyi bırakmadan önce doğrulamak gibi çok daha kolaydır.
  3. (# 1 Benzerler) Bu temiz göçler yapma ve kolay klonlama, "kullanıcı içeriği" ve "sistem içeriğini" ayırır.
  4. Daha kolay içeri sürüm denetimleri eklemek için daha az komut değişiklikler gerekiyor, vb gibi dosyaları, parça / store sürüm değişiklikleri yönetmek,

Performansı büyük bir sorun ve güvenlik ve yedekleme olmayan (ya da iyi bir fs yedekleme sistemi varsa) o zaman bunu FS saklayabilirsiniz, ama o zaman bile sık sık DB (görüntülerin durumunda) dosyaları saklamak durumunda ve (evet, bu daha fazla HD alanı kullanır, ama bu hemen hemen hiç bir sınırlayıcı faktör) o kullanılan sonra ilk kez bir önbellek klasörüne görüntü yazar bir önbelleğe alma komut dosyası oluşturma.

Neyse, belli ki FS birçok durumda iyi çalışıyor, ama ben şahsen çok daha kolay ve daha esnek DB yönetimi bulmak ve iyi yazılmış eğer performans cezalar son derece küçük.

Biz DB depolanan görüntüleri bir mağaza daha yarattı. Bu gelişim sırasında büyük çalıştı ama biz üretim sunucularında test kez sayfa yükleme süresi çok yüksek olduğunu ve bu DB sunuculara gereksiz yükü ekledi.

Bu getiriliyor ve onlara sadece dosya sistemindeki dosyaları tutmak ve DB yolları / meta verilerini depolamak önlenebilir ekstra karmaşıklığı ekler manipüle DB ikili dosyaları saklamak için cazip görünüyor olsa da.

Bu, her iki tarafta mükemmel argümanlar ile bu sonsuz tartışmalardan biridir, ama benim para için ben DB görüntüleri uzak tutmak istiyorsunuz.

Geçenlerde bu ucun listesini gördüm: http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries

Tip 17: For your web application, images and other binary assets should normally be stored as files. That is, store only a reference to the file rather than the file itself in the database.

Dolayısıyla, sadece görüntü için dosya yolunu kaydetmek :)

Ben önceki projelerde hem çözümler (dosya sistemi ve veritabanı-kalıcı görüntüler) hayata geçirdik. Benim düşünceme göre, sizin veritabanında görüntüleri depolamak gerekir. İşte sebebi:

  1. App sunucuları kümelenmiş zaman dosya sistemi depolama daha karmaşıktır. Paylaşılan depolama olması gerekir. Mevcut çevre kümelenmiş olmasa bile, bu size ihtiyacınız olduğunda daha zor büyütmek için yapar.
  2. Sen zaten statik içerik için bir CDN kullanarak ve kökeni olarak app kurmak olmalıdır. Bu uygulama sadece o CDN önbelleğe olacak, belirli bir görüntü için bir kez vurmak anlamına gelir. CloudFront kurmak için ucuz ve basit kir ... kullanmak için hiçbir neden yok. Dinamik içerik için bant genişliği kaydedin.
  3. Bu veritabanı görüntüleri kalıcı geliştirmek için çok daha hızlı (ve dolayısıyla daha ucuz) bulunuyor
  4. Sen veritabanı ile bilgi tutarlılığını almak görüntüleri devam etti. Eğer dosya sistemi görüntüleri depolamak ediyorsanız, kaçınılmaz olarak eşleşen veritabanı kayıtları ile yetim dosyaları olacak, ya da kırık dosya bağlantıları ile veritabanı kayıtlarını olacak. Bu sadece bir zaman meselesi ... ne OLACAKTIR. Bu temizlemek için bir şeyler yazmak gerekir.

Her neyse, benim iki sent.

Ben en veritabanı motorları BLOB verilerinin depolanması herhangi bir dezavantajı (şişirilmiş db vb) üretmek değil zaten çok gelişmiş olduğunu düşünüyorum. Bir avantajı görüntü zaten veritabanında olduğunda herhangi bir kırık linkleri yok olmasıdır. Söyleniyor, ben diskte dosya depolamak ve veritabanına URI vermek, böylece kendimi her zaman yaptım. Bu kullanım bağlıdır. Hiçbir ad-problemleri - sayfa genellikle çok dinamik ve değişiklikleri ise o img-in-db işlemek için daha kolay olabilir. Ben bunu tercih ne kopuş olduğunu söylemek zorundayım.

Ben size db görüntü saklamak yok öneririm. Her kullanıcı db onun / onu profili ile ilişkili benzersiz bir kimliği sahip olacak Bunun yerine, çünkü sunucu üzerinde fiziksel görüntü saklamak için bu kimliği kullanın.

örneğin bir kullanıcı kimliği 23 varsa, sen www.yourname.com/users/profile_images/23.jpg bir görüntü saklayabilirsiniz. Sonra, görüntülemek için görüntü varsa kontrol edebilir ve buna göre başka göstermek sizin genel bir simge görüntüler.

Diğerleri önerilen:

  • Dosya sistemindeki görüntüleri depolamak
  • Dosya depolamak için zahmet etmeyin, sadece ("zaten biliyor" diye ya da başka bir şey) kullanıcı kimliği kullanmak
  • Farklı bir sunucu üzerinde statik verileri koymak (sadece normal sunucusuna bir takma ad olarak "static.yourdomain.com" kullanmak bile)

Neden?

The bigger your database gets the slower it will get. Storing your image in the database will increase your database size. Storing the filename will increase your database size.

Farklı bir sunucu (takma ad) statik verileri koyarak:

  • Çok daha kolay ölçekleme yapar
  • Çoğu tarayıcı yükleme hızlandırmak "ikinci" sunucu üzerinde statik verileri koyarak, aynı sunucuya ikiden fazla istekleri göndermez

Sadece bu nedenle, blob olarak benim img test edilmiş. Bu çözüm dosyası olarak sunucu üzerinde görüntülerin daha yavaş çalışıyor. Yükleme süresi DB görüntü veya http ama is't ile aynı olmalıdır. Neden? Görüntüler sunucuda dosyalar olduğunda emin im, tarayıcı, sadece bir kez ilk defa o ve yükleme önbelleğe olabilir. Görüntü formu DB giderken, her zaman yeniden yüklenir. Bu benim oppinion bulunuyor. Belki tarayıcı önbelleği, ama çalışma yavaş (damla) hakkında yanılmışım. İngilizcemi SRY, ne olursa olsun; P

Bunlar hem çözümlerin artıları vardır

In BLOBS :

1) Artıları: Eğer sunucular arasında dosya eşitleme gibi zor noktaları işlemek zorunda değilsiniz çünkü kümeleri uyuz kolaylığı

2) DB yedekleri de kapsamlı olacak

In files

1) Yerli önbelleğe handly (ve (DB varsayılan olarak son değiştirme zamanı işleme değildir yenilemesi ve DB yeniden zorunda kalmazsınız başlıklarıyla önceki yorumların eksik nokta)

Daha sonra yeniden boyutlandırma 2) Kolaylığı

3) ılımlılık Kolaylık (sadece) her şeyin doğru olup olmadığını kontrol etmek için klasörler geçmesi

Tüm bu nedenlerden dolayı ve beri veritabanlarının iki artılarını ben şiddetle tavsiye dosyaları dosya sistemine çoğaltmak kolay!

Gün boyunca araştırma yaptıktan sonra, ben veritabanı görüntüleri ve ikili depolama sistemi yaptı.

Bu sadece büyük oldu. Ben erişim kontrolü, resim boyutlandırma (elbette, dinamik görüntüleri küçültmek değil), istatistikler, yedekleme ve bakım gibi, şimdi dosyalar üzerinde% 100 kontrole sahip.

Benim hız testlerde, Sistem artık 10x yavaştır. Ancak, hala üretimde değil ve ben sistem önbellek ve diğer optimizasyonlar uygulayacak.

Check this real example, still in development, on a SHARED host, using a MVC: http://www.gt8.com.br/salaodocalcado/calcados/meia-pata/

Bir kullanıcı açtıysa, bu örnekte, o farklı görüntüleri görebilirsiniz. Ikili DB olan tüm ürünlerin görüntüleri ve diğerleri değil, FS, saklanmıyor.

Ben özel bir sunucu bazı testler yaptık ve sonuçları bugüne kadar beklentilerin ötesinde vardı.

Bu DB görüntüleri depolamak, bunu başarmak için büyük bir çaba gerekiyor rağmen Yani, benim kişisel görüşüme göre, değer ve faydaları eksilerini çok daha değer.