Bir dosya barındırma için dizin yapısı

5 Cevap php

Ben bu dosyaları benzersiz id verir ve sadece bir dizinde saklar gidiyor basit bir dosya ev sahibi var. Ben bu ileride sorunlara neden olacağı söylendi ve ben ötesinde geleceğe ve içine düzgün çalıştığından emin olmak için ben dışarı bakmak gerektiğini şey merak ediyorum.

Ayrıca, başlık bilgilerini ve readfile () göndererek indirme zorlama ile bir performans sorunu var mı? Bu dosya adlarını korumak ve kullanımları indirme bir komut dosyası kullanarak değil doğrudan izin için daha iyi olurdu?

Teşekkürler

5 Cevap

Ayrıca, başlık bilgilerini ve readfile () göndererek indirme zorlama ile bir performans sorunu var mı?

Evet, safça bunu yaparsanız. İyi bir dosya indirme komut gerekir:

  • dolum bellek önlemek için uzun dosyaları stream
  • önbelleklerini sağlamak için destek ETAG'ları ve Son-Modifiye istek / yanıt başlıkları çalışmaya devam
  • makul Bitiş / Cache-Control ayarları ile geldi

Hala hızlı (genellikle C yazılır ve ağır belki hatta bunun için OS çekirdek özelliklerini kullanarak, dosyaları hizmet için optimize edilmiş) web sunucusu olarak olmayacak, ama çok daha iyi olacak.

Bu dosya adlarını korumak ve kullanımları indirme bir komut dosyası kullanarak değil doğrudan izin için daha iyi olurdu?

Daha iyi gerçekleştirmek istiyorsunuz, evet, ama güvenlik hakkına almak bir sorundur. here bazı tartışmalar için bkz.

URL gibi bir şey görünüyor, böylece bir uzlaşma, bir yeniden yazma kullanmaktır:

hxxp://www.example.com/files/1234/Lovely_long_filename_that_can_contain_any_Unicode_character.zip

Ama dahili yönlendirildi:

hxxp://www.example.com/realfiles/1234.dat

(çabucak) sunulduğu web sunucusu tarafından.

Çok büyük olasılıkla hakkında söylendi sorunların tür performance impact of piling thousands and thousands of files in the same directory ile yapmak zorundayız.

Bunu aşmak için, doğrudan bir dizin altında dosyaları saklamak yok, ama try to spread them out under subdirectories (buckets).

Bunu başarmak için, depolamak üzeresiniz dosyasının (en 19873 diyelim) kimliği bakmak, ve <uploads>/73/98/19873_<filename.ext>, burada 73 edilir ID % 100 altında saklamak, 98 {olduğunu [(2)]} vs

Eğer <uploads> altında en fazla 100 alt dizinlere sahip olacaktır yukarıdaki garanti ve altında en fazla 100 daha alt dizinleri <uploads>/*. Bu ince yapraklara dizin başına dosya sayısının dışında anlamlı olacaktır.

Alt dizinleri iki düzeyi yeterince tipiktir ve (aynı dizinde bakmak için çok fazla dosya adları var ne olur genişlik hem inode'lar için dizin veya dosya adlarını çözmek çok fazla zaman harcamıyorum arasında iyi bir dengeyi temsil - Modern dosya sistemlerinde böyle olsa gibi ext3 Eğer derin dosya arıyor 20 alt dizin gitmek zorunda) ne (burada çok verimli olması) ve derinlik olacaktır. Ayrıca 100 yerine daha büyük veya daha küçük değerler (10, 1000) kullanmayı seçebilir. Modulonun 100 İki düzeyde 100k ve 5M dosyaları arasında için ideal olacaktır

Alınacak gereken bir dosyanın kimliği verilen dosya sistemindeki bir dosyanın tam yolunu hesaplamak için aynı tekniği kullanır.

İlk soru gerçekten kullandığınız dosya sisteminin türüne bağlıdır. Cevaplarken herhangi günlüklerinde optimizasyonlar olmadan ext3 kabul edeceğiz.

Dosya sayısı sistem ARG_MAX aştığında Birincisi, evet, bir yerde çok sayıda dosya bir sorun neden olabilir. Çok argüman şikayet ederken, diğer bir deyişle, rm-rf * çıkmak olacaktır. You diretories az / AZ ve otopark uygun eşsiz adına en soldaki byte değerine göre dosyalar sahip düşünebilirsiniz.

Eğer gerçekten dolduruyor başladıktan sonra da, kısa bir süre içinde bu dosyaların tüm açacak süreçleri kaçınıyorum ... 'updatedb' gibi Crons sorunlara neden olur. Aynı şekilde, 'find' gibi komutları kapsamı dışında bu dizinlere tutmaya çalışın.

Yani diğer potansiyel sorunu, tamponlar yol açar. Nasıl sık sık bu dosyalar erişilen? Belirli bir dizindeki 300 dosya olsaydı, hepsi en az bir kez 30 dakika başına ulaşılabilir olurdu? Eğer öyleyse, muhtemelen Linux daha fazla bellek geri ve PHP / Apache / Etc için kullanılabilir hale getirecek, böylece / proc / sys / vfs_cache_pressure ayarını açmak isteyeceksiniz.

Son olarak, readfile ilgili ... Ben sadece bir doğrudan indirme bağlantısını kullanarak öneririm. Bu PHP indirme sırasında hayatta kalmak zorunda önler.

Eğer binlerce dosya olması muhtemeldir iseniz, birçok alt dizinleri arasında onları yaymak gerekir.

Eğer benzersizliğini garanti onu cendereye gerekebilir ama ben, orijinal dosya tutmak öneririz. Sorunları teşhis olduğunda bu olur.

Ben kötüye kontrol etmek için bazı komut dosyası kullanarak öneririm benim görüşüm değilim. Ayrıca ben senin script orijinal durumuna ilişkin bir veritabanı üzerinde bir dizin oluşturmak sürece dosya adlarını korumak için öneririz. Ayrıca, bunun üzerine bazı Rewrite büyü ile son kullanıcıya (benzersiz id) arkasındaki gerçek adını teşhir değil tarafından bir güvenlik katmanı getiren, bu şekilde bir senaryo yapmak için deneyebilirsiniz.