[PHP] skladiščenje naloženih datotek uporabnikov
6 naročnikov
6 naročnikov
Pozdravljeni!
Zanima me, kako je najboljše "skladiščiti" naložene datoteke uporabnikov. Recimo, da
uporabniki naložijo 30.000 datotek vsega skupaj.
Zanima me, ali je dobro skladiščiti datoteke v eni mapi, ali recimo po 100 datotek v mapo
in se ustvarjajo dodatne mape, ko je recimo v eni mapi 100 datotek?
Če je naloženih datotek recimo 30.000, potem je na takšen način ustvarjenih 300 map. Ali je
to primerna rešitev?
kakšne so vaše izkušnje s tem in kaj predlagate (obstajajo kakšne rešitve)?
Gre za PHP.
Hvala za vaše odgovore.
8 odgovorov
Zanima me, ali je dobro skladiščiti datoteke v eni mapi, ali recimo po 100 datotek v mapo
in se ustvarjajo dodatne mape, ko je recimo v eni mapi 100 datotek?
To verjetno ne bo najbolje, ker ne boš mogel preverjati v katero mapo spada določena datoteka.
Sam bi uporabil dva načina:
1. Solitranje pod datumu: mape se kreirajo pod datumih: 2011/09/20
Se pravi prva mapa je letnica, druga mesec in potem dan. Seveda pa bo to najlažje če imaš datoteke povezane z recimo mysql bazo, kjer je shranjen datum nalaganja
- Solitanje po ID uporabniku. Čeprav zna tukaj nastati problem, če boš imel recimo 3.000 uporabnikov. To pa je kar velika količina map.
Toliko zaenkrat z moje strani, lahko pa da bo kdo drug imel dosti boljšo rešitev.
Sem imel primer, ko je imela spletna stran več kot 30000 slik v eni mapi.
Na strani so se slike normalno prikazovale, če sem pa s filebrowserjm hotel mapo odpret, sem se pa kar pošteno načakal.
Zmisli si nek simple sistem shranjevanja datotek.
npr: datoteka.jpg
Če boš naredil vsaj 1 podmapo npr. s prvo črko imena datoteke, boš pri 30k datotekah že veliko naredil.
primer:
Datoteka "datoteka.jpg" se shrani v mapo /d/datoteka.jpg
Lahko pa iz filenama zgeneriraš nek hash, kot to naredi phpThumb in poljubno razvejaš direktorijsko strukturo.
npr md5("datoteka.jpg") = d1148913c00c582e84b99a7857a97a1f
To se lahko shrani v /d/1/1/datoteka.jpg ,....
Lahko bi tudi generiral mape glede na datum vnosa datoteke.
/2011/9/datoteka.jpg
Lahko pa vse skupaj shraniš tudi v bazo.
Možnosti je veliko, lahko se za katero odločiš ali pa tudi ne.
Pri 30000 nebo konec sveta če imaš vse v 1 mapi :)
Odvisno kok si hočeš zagrenit življenje :)
Če delaš nek projektič katerega uspeh ni zagotovljen potem šopaj vse v eno mapo in se posveti drugim bolj pomembnim zadevam. Spremeniš lahko, ko boš imel res preveč datotek.
ali pa:
Mape in podmape glede na prva dva znaka v imenu datoteke.
Dobiš tako strukturo:
/a/b/abakus.jpg
/a/n/aneks.jpg
/a/v/avto.jpg
/a/1/a1.jpg
Tko mislim, da ima tudi Magento to rešeno.
Če gre za slike bo tako verjetno kar ok, sicer pa če delaš kaj drugega lahko delaš mesečne mape v smislu
201108
201109
201110
Pozoren bodi kater filesystem uporabljas na strezniku, ce je linux je ponavadi ext3.
Primer:
Za vsako podjetje ustvaris novo datoteko in imas okoli 90k podjetij, ti ze v naprej povem da ti ne bo dovolilo ustvariti toliko datotek + vse skupaj bo zelo stekalo oziroma sploh ne bos moral vec delati z mapo v kateri bi imel datoteke podjetij :)
Svetujem da dobro razmislis preden se lotis dela, ce bos imel velike stevilke :P
FAT32:
Maximum number of files: 268,435,437
Maximum file size: 4GB
maximum number of files per directory: 65535
NTFS:
Maximum number of files: 4,294,967,295
Maximum file size: 16TB currently (16EB theoretically)
Ext2:
Maximum number of files: 10¹⁸
Maximum file size: 2TB
theoretical file per directory limit: 1.3 × 10²⁰ files
Ext3:
Maximum number of files: number of bytes in volume/2¹³.
Maximum file size: 16GB (1KB block) to 2TB (4KB block)
The correct number is 31998 (ext3, max sub-directories per one directory).