Lazy generovanie náhladov obrázkov rubrika: Programování: PHP

4 lt
položil/-a 28.1.2015

Ahojte. Po prečítaní článkov http://blog.medio.cz/jak-ukladame-obrazky a http://blog.medio.cz/jak-zobrazujeme-obrazky som sa rozohodol nasadiť podobnú funkciu na jeden vačší projekt (cca 1000 nových obrázkov denne), ale do budúcna aj na menších weboch.

V skratke ako to bude fungovať:

  • v .htaccess skontrolovať cez "-f" existenciu náhladu obrázka - ak existuje, stiahne sa rovno tento statický súbor.
  • ak neexistuje, pošle sa php skriptu cesta a po overení všetkých údajov (existencia pôvodného súboru, v configu povolená velkosť náhladu) sa vytvorí náhlad a rovno pošle prehliadaču.
  • ide mi hlavne o pohodlnosť pridávania nových typov náhladov (zmenou cesty v src a configu) + netreba pri uploade naraz generovať XY typov náhladov.

Chcel by som poprosiť ludí čo majú s podobným systémom skúsenosti o tipy a rady (odporúčané postupy, čomu sa vyhnúť a podobne).

Poznámky:

  • v článkoch vyššie sa píše, že pri generovaní vačšieho množstva zmenšenín môže toto aj zabiť server. Toho sa najviac obávam. Stáva sa to?
  • obrázky môžu byť vo vačšom rozlíšení (limit je 5 MB na súbor, len jpg)
  • zdielaný hosting (žiadny exec() ani ImageMagick, len GD)
  • môže sa stať, že v budúcnosti sa pridá nový rozmer náhladu a bude ho treba vytvoriť zo všetkých (tisícov) obrázkov (predgenerovať ich všetky, alebo to nechať na automatike?)
  • naraz na jednej strane sa môže zobraziť max. 30 obrázkov (náhladov)

Budem rád za každý tip alebo odkaz (našiel som len pár tém na Stack Overflow a fóre Nette), ideálne od ludí čo už tento postup používajú.

Diky

Komentáře

  • dzejkob : No přesně takhle jsem to vymyslel před asi miliardou let a měl jsem doteď za to, že to je dost blbě. Matně si vybavuju nějakou hashovací funkci, která prý uměla "nějak" co nejlépe eliminovat to, že při md5 je dost nevyváženej počet souborů na složku. Nebo si na to napsat něco, co to rozhazuje do složek efektivně. Ale jak někdo píše v těch komentářích, tak nějakejch přímočarých blob-storages jsou napsaný určitě mraky - tak je zbytečný tohle vůbec dělat. 28.1.2015
  • dzejkob : jo aha - sdílený hosting - tak to nevim 28.1.2015
  • Kit : @dzejkob: Dnešním filesystémům je to zpravidla jedno, chovají se jako NoSQL databáze a adresáře mají v b-stromech. Je dobré si to ověřit. 29.1.2015
  • m.maiksnar : Ještě je vhodné před vygenerováním náhledu kontrolovat, zda již neběží generování tohoto náhledu v jiném požadavku. Výsledkem by mohl být porušený soubor s náhledem nebo chyba (dle toho zda OS povolí 2x otevřít stejný soubor pro zápis) a zbytečné zatěžování serveru. 29.3.2015
odkaz
6 Žížala
odpověděl/-a 29.1.2015

Ad adresářová struktura (jen tak z hlavy)

$path  = round($IDObrazku / 1 000 000 000,0) . "/";
$path .= round($IDObrazku / 1 000 000,0) . "/";
$path .= round($IDObrazku / 1 000,0);
$path = "/images/THUMBSSIZE/$path/FILENAME-$IDOBRAZKU.EXT";

Není to lepší než nějaká MD5? Budete mít max 1000 obrázků v adresáři.

Komentáře

  • lt : Pekné, určite skúsim. 29.1.2015
  • JaSei : My tedy pouzivame (na soubory obecne, ale to je detail) prvni byty (sha256, ale to je dalsi detail) a funguje to fajn... Napr 00/11/22/00112233xxxx.dat... Tri urovne = 256^3 souboru celkem po jednom souboru v kazdem adresari (hashovaci algoritmus zaridi skoro idealni rozlozeni) 29.1.2015
  • tomas.fejfar : Bylo by vhodndější používat modulo (zbytek po dělení), aby dva po sobě jdoucí obrázky nepadly do stejné složky ;) 13.2.2015
  • Žížala : @tomas.fejfar: Co je na tom špatného? Pak by šla do kýblu myšlenka 1000 souborů na folder. 16.2.2015
  • PeterA : Tento príklad funguje iba ak je $IDObrazku menšie ako 999999. Ak je väčšie, na tretej úrovni bude viac ako 1000 adresárov. Odporúčam skôr niečo ako písal unavensluncem, ja používam toto: function getSafeDir($id, $level = 4) { $hash = hash('sha256', $id); for($i = 0; $i < $level; $i++) { $dir .= ord(substr($hash, $i, 1)) . DIRECTORY_SEPARATOR; } return $dir; } 19.3.2015

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.