Cache na náhledy obrázků

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Hellish
Člen | 16
+
0
-

Udělal jsem si jednoduchý skript na generování náhledů ze zdrojových obrázků. Tento skript nejdříve ověří, jestli již neexistuje uložený náhled v adresáři thumbnails a pokud ano, tak jej rovnou vrátí. Pokud ne, tak jej vygeneruje, uloží do adresáře thumbnails a vrátí jej.

Pak mi ale došlo, že bych pro ukládání již vygenerovaných náhledů mohl využívat cache, která je v Nette relativně hezky vyřešená. Než se pustím do přepsání toho skriptu, tak se chci zeptat jestli v tom není nějaké úskalí, cpát úplně všechno do cache. Na druhou stranu od toho cache je, ne?

Jakub Šulák
Člen | 222
+
0
-

No já osobně si myslím, že by měla být implementována cache již na straně Nette\Image. Tedy že by se cache měla implementovat přímo do Nette…

David Grudl
Nette Core | 8129
+
+1
-

Zrovna na tohle bych asi cache nevyužíval.

Hellish
Člen | 16
+
0
-

Zrovna na tohle bych asi cache nevyužíval.

Dá se tedy někde dočíst, k čemu se cache hodí a k čemu ne (a proč)? Uložení vygenerovaného náhledu do souboru není z principu nic jiného než cachování, ne?

Díky

Jakub Šulák
Člen | 222
+
0
-

No, ono pokud člověk volá nejen zmenšení, ale také i doostření a exportem jsou malé obrázky se pak velice hodí možnost zapnout si nějakou automatickou cache s možností jednoduché invalidace.

Ondřej Mirtes
Člen | 1536
+
0
-

Cache se v tomto případě opravdu moc nehodí. Je určena pro případy, kdy chceš nějak odlehčit zátěži serveru. Kdežto v případě náhledů obrázků je přeci negeneruješ při načítání stránky, ale při jejich uploadování v administraci. Není tedy zrovna vhodné, aby při smazání obsahu složky temp např. z důvodu updatu na novou verzi Nette se musely všechny náhledy obrázků generovat znova.

Petr Motejlek
Člen | 293
+
0
-

LastHunter napsal(a):

Cache se v tomto případě opravdu moc nehodí. Je určena pro případy, kdy chceš nějak odlehčit zátěži serveru. Kdežto v případě náhledů obrázků je přeci negeneruješ při načítání stránky, ale při jejich uploadování v administraci. Není tedy zrovna vhodné, aby při smazání obsahu složky temp např. z důvodu updatu na novou verzi Nette se musely všechny náhledy obrázků generovat znova.

Co je to a podivnost — generovat již v administraci při uploadu — ty přesně víš, kde všude na webu se bude náhled obrázku ukazovat a jakou bude mít velikost? Na spoustě webů mám náhled obrázku na několika stránkách a pokaždé v trochu jiných rozměrech (jednou se hodí mít ten obrázek do 100×100, jindy zase jako 150×50, atd.). Nehledě na to, že do DB obvykle nahraju obrázek v rozměrech, které mi dal uživatel (občas ho Nette\Image proženu a udělám si z něj PNG s maximálním rozměrem a kvalitě). Při výstupu minimálně potřebuju každý takový obrázek pak obalit watermarkem (to ale jen v případě, že je obrázek větší než daná mez (zase je zbytečné strkat watermark na obrázek o velikosti 50×50 ;))).

Na tohle se Cache určitě hodí a proto tu taky je.

EDIT: A imho nikdo po tobě přeci nechce, abys mazal celý temp při aktualizaci nette ;)

Editoval m0t3jl (21. 7. 2009 11:30)

Ondřej Mirtes
Člen | 1536
+
0
-

m0t3jl napsal(a):

LastHunter napsal(a):

Cache se v tomto případě opravdu moc nehodí. Je určena pro případy, kdy chceš nějak odlehčit zátěži serveru. Kdežto v případě náhledů obrázků je přeci negeneruješ při načítání stránky, ale při jejich uploadování v administraci. Není tedy zrovna vhodné, aby při smazání obsahu složky temp např. z důvodu updatu na novou verzi Nette se musely všechny náhledy obrázků generovat znova.

Co je to a podivnost — generovat již v administraci při uploadu — ty přesně víš, kde všude na webu se bude náhled obrázku ukazovat a jakou bude mít velikost? Na spoustě webů mám náhled obrázku na několika stránkách a pokaždé v trochu jiných rozměrech (jednou se hodí mít ten obrázek do 100×100, jindy zase jako 150×50, atd.). Nehledě na to, že do DB obvykle nahraju obrázek v rozměrech, které mi dal uživatel (občas ho Nette\Image proženu a udělám si z něj PNG s maximálním rozměrem a kvalitě). Při výstupu minimálně potřebuju každý takový obrázek pak obalit watermarkem (to ale jen v případě, že je obrázek větší než daná mez (zase je zbytečné strkat watermark na obrázek o velikosti 50×50 ;))).

Na tohle se Cache určitě hodí a proto tu taky je.

EDIT: A imho nikdo po tobě přeci nechce, abys mazal celý temp při aktualizaci nette ;)

No měl bych to vědět, zkrátka mi přijde divné, aby se náhledy vytvářely až při renderování stránky, měly by již být dávno připravené.

A cache je něco, co má být plně nahraditelné, pokud tu starou smažu. Vytvářet náhledy všech obrázků znova po každém smazání tempu by byla velká zátěž na server. Co ti brání ten obrázek zmenšovat a přidávat watermark při uploadu v administraci, kdy je to IMHO nejlogičtější provádět?

A mazat temp se po mně chce, viz download – Po každé aktualizaci Nette nezapomeňte smazat dočasně soubory (adresář temp).

Honza Kuchař
Člen | 1662
+
0
-

Já to používám stejně :) (geruji náhledy líně – až jsou potřeba; to líné generování doporučuji, hromada obrázků ani náhledy nemá – nikdo si je nezobrazil, nevím proč bych měl mít uloženy od obrázků, které si nikdo nezobrazil: 2200obrázků; 2540náhledů – kdybych používal generování v administraci, byl by jich přesně dvojnásobek), ale cache nette na to nepoužívám a to jenom z jediného důvodu: když jsem to psal, tak jsem ještě o nette nevěděl.

P.S.: Nevíte někdo kolik je omezení file systemu na počet souborů (mám pocit, že nějaký je) v jedné složce?

jasir
Člen | 746
+
0
-

Po každé aktualizaci Nette nezapomeňte smazat dočasně soubory (adresář temp).

K tomu mázání – není nutné mazat celý temp, stačí smazat jen vygenerované šablony a index robotloaderu.

Editoval jasir (21. 7. 2009 12:27)

Petr Motejlek
Člen | 293
+
0
-

jasir napsal(a):

Po každé aktualizaci Nette nezapomeňte smazat dočasně soubory (adresář temp).

K tomu mázání – není nutné mazat celý temp, stačí smazat jen vygenerované šablony a index robotloaderu.

To jsem měl na mysli, nemusím mazat všechny soubory, jen třeba ty od RobotLoaderu a Nette-Template

Petr Motejlek
Člen | 293
+
0
-

LastHunter napsal(a):

m0t3jl napsal(a):

LastHunter napsal(a):

Cache se v tomto případě opravdu moc nehodí. Je určena pro případy, kdy chceš nějak odlehčit zátěži serveru. Kdežto v případě náhledů obrázků je přeci negeneruješ při načítání stránky, ale při jejich uploadování v administraci. Není tedy zrovna vhodné, aby při smazání obsahu složky temp např. z důvodu updatu na novou verzi Nette se musely všechny náhledy obrázků generovat znova.

Co je to a podivnost — generovat již v administraci při uploadu — ty přesně víš, kde všude na webu se bude náhled obrázku ukazovat a jakou bude mít velikost? Na spoustě webů mám náhled obrázku na několika stránkách a pokaždé v trochu jiných rozměrech (jednou se hodí mít ten obrázek do 100×100, jindy zase jako 150×50, atd.). Nehledě na to, že do DB obvykle nahraju obrázek v rozměrech, které mi dal uživatel (občas ho Nette\Image proženu a udělám si z něj PNG s maximálním rozměrem a kvalitě). Při výstupu minimálně potřebuju každý takový obrázek pak obalit watermarkem (to ale jen v případě, že je obrázek větší než daná mez (zase je zbytečné strkat watermark na obrázek o velikosti 50×50 ;))).

Na tohle se Cache určitě hodí a proto tu taky je.

EDIT: A imho nikdo po tobě přeci nechce, abys mazal celý temp při aktualizaci nette ;)

No měl bych to vědět, zkrátka mi přijde divné, aby se náhledy vytvářely až při renderování stránky, měly by již být dávno připravené.

A cache je něco, co má být plně nahraditelné, pokud tu starou smažu. Vytvářet náhledy všech obrázků znova po každém smazání tempu by byla velká zátěž na server. Co ti brání ten obrázek zmenšovat a přidávat watermark při uploadu v administraci, kdy je to IMHO nejlogičtější provádět?

A mazat temp se po mně chce, viz download – Po každé aktualizaci Nette nezapomeňte smazat dočasně soubory (adresář temp).

Nejlogičtější to není, jak se zachováš, když ti někdo řekne, že máš ten watermark změnit (a změnu projevit u všech obrázků) – v tvém pojetí budeš muset mít skript, který všechno již uložené projde a nahradí watermark (nebo udělá cokoliv dalšího) a budeš muset upravit i skript, ve kterém ty obrázky přidáváš do DB.

V mém pojetí prostě smažeš došasné soubory od cache na ty obrázky a upravíš skript, který ty náhledy dělá — to je podle mě méně starostí a lépe se to pak čte a upravuje.

Petr Motejlek
Člen | 293
+
0
-

honzakuchar napsal(a):

Já to používám stejně :) (geruji náhledy líně – až jsou potřeba; to líné generování doporučuji, hromada obrázků ani náhledy nemá – nikdo si je nezobrazil, nevím proč bych měl mít uloženy od obrázků, které si nikdo nezobrazil: 2200obrázků; 2540náhledů – kdybych používal generování v administraci, byl by jich přesně dvojnásobek), ale cache nette na to nepoužívám a to jenom z jediného důvodu: když jsem to psal, tak jsem ještě o nette nevěděl.

P.S.: Nevíte někdo kolik je omezení file systemu na počet souborů (mám pocit, že nějaký je) v jedné složce?

Omezení jsou, neznám přesná čísla, ale dřív než se k té hranici dostaneš, tak ti začne jakákoliv operace nad tím adresářem timeoutovat ;) Z tohoto důvodu jsem kdysi Davidovi na jednom ze školení naznačil, že by bylo dobré, ta FileStorage, co je v nette tohle nějak inteligentně řešila, aspoň tak, že v tempu bude dělat adresáře pro jednotlivé namespacy, bohužel se to minulo učinkem a David tu poznámku ignoroval :(.

Ondřej Brejla
Člen | 746
+
0
-

Omezení jsou všude jiná, jsou závislá na konkrétním file systému.

Petr Motejlek
Člen | 293
+
0
-

Warden napsal(a):

Omezení jsou všude jiná, jsou závislá na konkrétním file systému.

To jo, ale implementovat nějakou featuru pro vytváření těch adresářů by asi uvítal každý. Ještě jsem neviděl hosting, kde by nabízeli možnost mít jeden adresář v aplikaci připojen ze svazku s třeba ZFS nebo XFS :(.

PetrP
Člen | 587
+
0
-

Taky zmenšuju obrázky líně (až když je potřebuju a o rozměrech které potřebuju) nevidím v tom nic špatného. Ba naopak, na webu používám třeba 20 různých rozměrů to by se mi nahrání 30 souborů poněkud prodloužilo.

David Grudl
Nette Core | 8129
+
0
-

m0t3jl napsal(a):

Z tohoto důvodu jsem kdysi Davidovi na jednom ze školení naznačil, že by bylo dobré, ta FileStorage, co je v nette tohle nějak inteligentně řešila, aspoň tak, že v tempu bude dělat adresáře pro jednotlivé namespacy, bohužel se to minulo učinkem a David tu poznámku ignoroval :(.

Neignoroval, vlastně to tak sám používám, jen mám trošku obavy to nasadit do frameworku. Nebo to zkusíme?

David Grudl
Nette Core | 8129
+
0
-

Jednoznačně jsem pro líné generování a celý mechanismus spadá pod označení cache.

Důvod, proč jsem psal, že bych na to Nette\Caching nepoužil, je čistě výkonnostní. Obrázky je totiž nejlépe umístit do nějaké složky v document_root a nechat jejich stahování čistě v režii Apache. Bez PHP, bez frameworku. A nastavit nějaké pravidlo v .htaccess, které volá generátor, pokud obrázek neexistuje.

V tom generátoru samozřejmě je možné použít Nette, ale musel by se vytvořit nový ICacheStorage, který soubory cache ukládal bez metadat (tedy aby to byl čistě jen obrázek) – aby je poté už mohl číst Apache.

Teď si říkám, že napsat takový storage by možná bylo rychlejší než napsat tento post ;-)

Petr Motejlek
Člen | 293
+
0
-

David Grudl napsal(a):

m0t3jl napsal(a):

Z tohoto důvodu jsem kdysi Davidovi na jednom ze školení naznačil, že by bylo dobré, ta FileStorage, co je v nette tohle nějak inteligentně řešila, aspoň tak, že v tempu bude dělat adresáře pro jednotlivé namespacy, bohužel se to minulo učinkem a David tu poznámku ignoroval :(.

Neignoroval, vlastně to tak sám používám, jen mám trošku obavy to nasadit do frameworku. Nebo to zkusíme?

Koukám, že si asi víc věcí bastlíš jen sám pro sebe, i když jsou prospěšné široké veřejnosti ;) (to bude jak s těmi substitucemi závislými na spojení u dibi ;)).

Navrhuji do 0.9 dát do Cache podobnou statickou proměnou, jako mají Presentery, tj. $oldLayoutMode (nazvat to nějak jinak) a jejím nastavením na false by se automaticky vytvářely adresáře namísto strohých souborů.

Co ty na to?

Petr Motejlek
Člen | 293
+
0
-

David Grudl napsal(a):

Jednoznačně jsem pro líné generování a celý mechanismus spadá pod označení cache.

Důvod, proč jsem psal, že bych na to Nette\Caching nepoužil, je čistě výkonnostní. Obrázky je totiž nejlépe umístit do nějaké složky v document_root a nechat jejich stahování čistě v režii Apache. Bez PHP, bez frameworku. A nastavit nějaké pravidlo v .htaccess, které volá generátor, pokud obrázek neexistuje.

V tom generátoru samozřejmě je možné použít Nette, ale musel by se vytvořit nový ICacheStorage, který soubory cache ukládal bez metadat (tedy aby to byl čistě jen obrázek) – aby je poté už mohl číst Apache

No a můžeš to nějak udělat, aby vždycky, když někdo půjde pro ten soubor, aby se provedla možná invalidace apod. ?

Patrik Votoček
Člen | 2221
+
0
-

David Grudl napsal(a):

Důvod, proč jsem psal, že bych na to Nette\Caching nepoužil, je čistě výkonnostní. Obrázky je totiž nejlépe umístit do nějaké složky v document_root a nechat jejich stahování čistě v režii Apache. Bez PHP, bez frameworku. A nastavit nějaké pravidlo v .htaccess, které volá generátor, pokud obrázek neexistuje.

Zrovna dnes nebo zítra jsem to chtěl řešit. Najde se někdo kdo by napsal nějáké to pravidlo pro .htaccess? Já v tom pořád něják plavu…

Teď si říkám, že napsat takový storage by možná bylo rychlejší než napsat tento post ;-)

To se pozná… :-) Mám si to napsat nebo to dopíšeš přímo do nette? Nechce se mě to dělat zbytečně. (A navíc: „když dva dělají totéž není to totéž“)

Editoval vrtak-cz (21. 7. 2009 22:57)

pmg
Člen | 372
+
0
-
RewriteEngine On

RewriteCond %{REQUEST_URI} ^/previews/([^.]+)\.(jpg|png|gif)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /images/preview?file=%1.%2 [NE,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
  • Náhledy jsou v adresáři /previews.
  • Routa má tvar <presenter>/<action>.
  • ImagesPresenter:preview dostane jako parametr file název souboru. Vygenerovaný obrázek uloží a zároveň pošle na výstup.
  • Pokud bys parametr přidával do routy (což nemá význam), nebude to fungovat. Leda že bys předával jméno bez přípony.
David Grudl
Nette Core | 8129
+
0
-

Experimentálně v revizi 451 se cache ukládá do podadresářů https://forum.nette.org/…-podadresaru?…

Patrik Votoček
Člen | 2221
+
0
-

pmg napsal(a):

RewriteEngine On

RewriteCond %{REQUEST_URI} ^/previews/([^.]+)\.(jpg|png|gif)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /images/preview?file=%1.%2 [NE,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

presmerovavani na www. z bez www. mam dat asi hned za zapnuti rewrite modulu ze? btw nestalo by za to doplnit (jpg|png|gif|jpeg)?

vrtak-cz napsal(a):

Teď si říkám, že napsat takový storage by možná bylo rychlejší než napsat tento post ;-)

To se pozná… :-) Mám si to napsat nebo to dopíšeš přímo do nette? Nechce se mě to dělat zbytečně. (A navíc: „když dva dělají totéž není to totéž“)

A tohle?

Editoval vrtak-cz (22. 7. 2009 3:27)

PetrP
Člen | 587
+
0
-

m0t3jl napsal(a):

No a můžeš to nějak udělat, aby vždycky, když někdo půjde pro ten soubor, aby se provedla možná invalidace apod. ?

Toto v případě že to obsluhuje apache není mozné, invalidovat se musí při nahrání souboru ;/

pmg
Člen | 372
+
0
-

presmerovavani na www. z bez www. mam dat asi hned za zapnuti rewrite modulu ze?

Ano.

btw nestalo by za to doplnit (jpg|png|gif|jpeg)?

Mně určitě ne, ale dovoluji ti si to tam dopsat.

Patrik Votoček
Člen | 2221
+
0
-

pmg napsal(a):

btw nestalo by za to doplnit (jpg|png|gif|jpeg)?

Mně určitě ne, ale dovoluji ti si to tam dopsat.

Děkuji za svolení… :-D