Dosyaların çok sayıda yönetmek için ipuçları?

6 Cevap php

Orada çok iyi bazı sorular SO hakkında dosya yönetimi burada ve büyük bir proje içinde saklamak.

Storing Images in DB - Yea or Nay?
Would you store binary data in database or in file system?

İlki bazı büyük anlayışlar olan ve projemde ben dosya yolu değil DB rota gitmeye karar verdim.

Dosya sistemini kullanarak karşı önemli bir nokta destektir. Ama bizim sistemde biz bu yüzden bu konuda endişeli değilim harika bir yedekleme planı var.

Sonraki yol gerçek dosyaları saklamak için nasıl. Ve ben her zaman statik dosyaları 'konuma sahip ve şeylerin veritabanı tarafında bir sanal dizin sistem oluşturmak düşündüm. Yani dosyaya bağlantılar değişmez.

I inşa ediyorum sistem böylece tüm dosyaları tüm kullanıcılar için erişilebilir tek bir global dosya yönetimi olacaktır. Ancak (tüm dosyalar, örneğin bir dizin içinde ise) fiziksel dizin boyutu hakkında dosya rota konuşmak gitti ki birçok

Yani benim soru bu statik dosyalar için klasör oluştururken bazı ipuçları ya da en iyi uygulama yöntemleri ne olduğunu, ya da ben tüm sanal dizin yol gitmek gerekir eğer.

(Yani hiç yardımcı olur proje LAMP yığını (PHP) üzerinde)

6 Cevap

Tek yolu, her dosya için benzersiz bir numara atamak ve gerçek dosya konumunu aramak için kullanmaktır. Sonra dosya sisteminde farklı dizinlere dosyaları dağıtmak için kullanımı bu sayı. Örneğin bu düzeni gibi bir şey kullanabilirsiniz:

/images/{0}/{1}/{2}

{0}: file_number % 100
{1}: (file_number / 100) % 100
{2}: file_number

Tek bir dizin girdileri aşırı sayıda oluşturarak önlemek için, size dosya parçaları üzerinde dizinleri oluşturma dayandırmak isteyebilirsiniz. Bir dosya adında d7f5ae9b7c5a.png varsa Yani, örneğin, size media/d7/f5/d7f5ae9b7c5a.png saklamak isteyebilirsiniz. Dosya adlarınız tüm onaltılık iseniz o zaman bu son seviyeye kadar 256 tek bir dizin girişlerinin sayısını kısıtlamak olacaktır.

Ben bir sürü dosya barındıran bir web sitesi için bir süre önce bu sorun koştu ettik. / B/C/C/BCC46E3F-2F7A-42b1: Yaptıklarımız (aynı zamanda bir dosyanın birincil anahtar alanı olan) bir GUID (örneğin BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) almak ve böyle bir dosya saklamak oldu -92CE-DBD6EC6D6301/filename.ext

Bu bazı avantajları vardır:

  • Birden çok sunucu üzerinde dosya sunucularını ölçek (ve her biri için belirli dizinleri atayabilirsiniz) olabilir
  • Siz dosyayı yeniden adlandırmak zorunda değilsiniz
  • Sizin dizinleri benzersiz olmasını garanti

Bu yardımcı olur umarım!

  1. Bir kullanıcı resmi ~ 100kb, böylece veritabanında 10 000 kullanıcıları atalım, her kullanıcının ortalama 5 görüntülerde olacak, bu yüzden DB 5 terabayt sahip olacak ve her bir görüntü çıktı DB ve bu ekstra DB trafiği üzerinden yürütülür azaltacak Genel DB sunucu performansı. ... Bunu önlemek için DB küme kullanın, ama pahalı olduğunu varsayalım olabilir

  2. Canlı veritabanı üzerinde hata ile ilgili kullanıcı raporu, (test - tüm düzgün çalışır), nasıl geliştiriciler makinede bir unpack bu dökümü yaratacak? Ne kadar zaman alacak?

  3. Bir an içinde bazı CDN görüntüleri koymak için karar verebilir, ne kaynak kodunda değişiklik olacak?

Ben genellikle bu yaklaşım:

Eğer yüklenen dosyaları depolamak klasörüne işaret uygulamanız için genel ayarları değişken var. Veritabanınızda (ne ayarları değişken noktaları göre) dosyaları göreli yolları saklayın.

Bir dosya / www / yüklenenler / Görüntü.jpg yer almaktadır Yani, ayarlarınız varible puan / www / veritabanı satır Image.jpg vardır yükler. Bu uygulama, sistem dizin yapısını decouples esnek bir yoludur.

Dahası bu ilişki ne veritabanı tabloları dayalı dizinlere dosya depolama fragmanı edebilirsiniz. Eğer bir tablo user_reports ve bir tablo user_photos söylüyorlar. Siz / www / yüklenenler / user_reports içinde user_reports ilgili dosyaları saklamak. Eğer kullanıcı yüklenenler sayıda varsa hatta daha fragmentaion uygulayabilirsiniz. Bir kullanıcı, dosya report.pdf denir 20.03.2009 tarihinde bir dosya yükler, böylece / www/uploads/user_reports/2009/03/20/report.pdf olarak saklamak söylüyorlar.

Ben apache ve PHP dosyaları yönetmek konusunda birşey diyemiyorum, ama ben ext3 dosya sistemi hakkında bir şeyler söyleyebilirim. ext3 aynı dizinde çok sayıda dosya ile ilgili sorunlar var görünmüyor. Ben bir milyon dosya ile test ettik. Dir_index seçeneği dizinleri oluşturmadan önce dosya sisteminde etkin olduğundan emin olun. Sen dump2fs çalıştırarak kontrol ve tune2fs çalıştırarak bu seçeneği değiştirebilirsiniz. Komut satırı araçları hala dizinin içeriğini listeleme sorunları olabilir çünkü dizinlerinin bir ağaca dosyaları karma hala yararlı olabilir.