[PHP] skladiščenje naloženih datotek uporabnikov

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

any idea? ali je čisto vredu, če se 30.000 datotek shranjuje v eno mapo?

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

  1. 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.

hvala za odgovore!! bom uporabil, da se generirata podmapi na prva dva znaka!

Potem pa bodi samo pozoren, da boš pred tem preverjal imena datotek: #$%.jpg

Č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).