Autor Zpráva
hunter_dave
Profil
Zdravím, mám obrázky vygenerované pomocí php - miniatury a obrázky s vodotiskem. Již jsem vyřešil jak je načítat do cache, ale nyní řeším problém:
Uživatel může měnit pořadí obrázků v galerii .. obrázky se řadí podle čísel to znamená obrázky k položce s id například :1111 budou :
imgview.php?img=1111_1.jpg
imgview.php?img=1111_2.jpg

atd...
Když uživatel prohodí obrázky .. obrázky se sice přepíšou na ftp, ale uživatel dostává pořád výsledek z cache.
Chci se zeptat jestli se pomocí php nějak nedá říct prohlížeči .. aktualizuj cache obrázků imgview.php?img=1111_1.jpg a imgview.php?img=1111_2.jpg, pokaždé když je uživatel prohodí a přítom zachovat cache, když s nimi nic nedělá (to znamená nechci
header("Cache-control: no-cache");
ani změnu v url jako třeba
imgview.php?img=1111_2.jpg&zmena=<?php echo time(); ?>
.. kvůli tomu aby se obrázky načetli ze stejného jména nově do cache
) apod...
Díky
blaaablaaa
Profil
hunter_dave:
A co si do db ulozit cas posledni zmeny a ten pak pridavat jako parametr k odkazu?
hunter_dave
Profil
Tím měním url obrázku .. já chci ten samej obrázek jenom refreshnout v cachi .. jako kdyz uzivatel zmackne refresh .. do cache se vse refreshnute nacte znovu. Přesně to potřebuju ale vyvolané php funkci .. prostě něco jako
header("imgview.php?img=1111_1.jpg : reload;") ;
.. ale to samozřejmě nefunguje .. napadlo mě po každé když chci obrázek refreshnout pridat do imgview promenou .. reload .. neco jako imgview.php?img=1111_1.jpg&reload=1 .. a pokud se reload rovna "1" poslat v hlavicce expires :-1 .. potom by to mělo snad aktualizovat cache ale nejsem si jistý .. vyzkouším .. mě de o to aby když změním obrázky a potom si pustím galerii aby tam ty obrázky byli nově nahrané z cache .. jednoduše řečeno .. chci používat cache ale zároveň chci aby v cachi byli uložené co nejnovější položky.
_es
Profil
hunter_dave:
Žiadaš splniť navzájom si odporujúce požiadavky.
Akým mimorealitným-mimosieťovým prepojením chceš informovať prehliadač o zmene toho súboru?
Ak chceš na strane klienta vynútiť opätovné načítanie, môžeš cez JS upraviť adresu tak, aby to bol pre prehliadač iný súbor, napríklad takto.
hunter_dave
Profil
To právě nechci .. vím, že je to těžce pochopitelný .. vyřešil jsem to částečně prostým header("Refresh:0,1") po každé změně .. tohle funguje všude kromě exploreru, ale i kdyby to fungovalo tam.. musí to nějak jít.

_es:
Akým mimorealitným-mimosieťovým prepojením chceš informovať prehliadač o zmene toho súboru?
Co třeba header? .. Ten přece prohlížeči říká jak se daný soubor má chovat .. jestli ho zapsat do cache nebo v jakém kódování ho zobrazit, jestli má prohlížeč refreshnout stránku, typ souboru, apod .. takže se tam nějak musí dát nastavit aby to daný soubor znovu načetlo do cache .. Na to se ptám !!!
_es:
Ak chceš na strane klienta vynútiť opätovné načítanie
Opět header .. refresh v daném čase .. ale to neznamená načtení do cache ..
_es:
Žiadaš splniť navzájom si odporujúce požiadavky.
Vůbec si to neodporuje .. je mi jasný, že to někdo nepochopí .. Je to trochu složitější na vysvětlení, ale mohl bys se prosím zaměřit na řešení problému jiným způsobem než kterým se vysloveně řekl, že nechci při založení tématu? .. obrázky se musejí zapisovat do cache a musejí mít stále stejnou adresu.
_es
Profil
hunter_dave:
Co třeba header? .. Ten přece prohlížeči říká jak se daný soubor má chovat .. jestli ho zapsat do cache
No a keď bude v cache pamäti, ako prehliadač zistí, či sa súbor zmenil - zase to musí prehliadač buď znova načítať, alebo použiť starú verziu obrázka.

jestli má prohlížeč refreshnout stránku
Ako má obrázok obsahovať v čase svojho načítania informáciu o refreshnutí stránky?

Opět header .. refresh v daném čase .. ale to neznamená načtení do cache ..
Aký header - hlavičky predsa posiela server, nie klient (v tomto prípade). Ak načíta nový obsah, tak je logické, že si to uloží aj do cache.

obrázky se musejí zapisovat do cache
Ako pracuje prehliadač s cache pamäťou je jeho záležitosť - to ovplyvníš len nepriamo, niektoré prehliadače ani nemusia mať cache pamäť.

musejí mít stále stejnou adresu
Ak majú rovnakú adresu, tak zase hrozí, že sa použije stará verzia obrázka, čo môžeš napraviť tými hlavičkami na neukladanie do cache, čo tiež nechceš, teda sa stále točíš v kruhu.

Možno by sa ti zišlo toto vlákno, no základnú vec, že na overenie „čerstvosti“ obrázka musí prehliadač v čase tesne pre zobrazením obrázka poslať na server nejaký dotaz a prijať odpoveď, neovplyvníš - mne sa zdá, že si to chcel vyriešiť bez tej komunikácie.

napadlo mě po každé když chci obrázek refreshnout pridat do imgview promenou .. reload .. neco jako imgview.php?img=1111_1.jpg&reload=1
To je z pohľadu prehliadača iný súbor, teda nie je dôvod, prečo by malo načítanie súboru imgview.php?img=1111_1.jpg&reload=1 nejako ovplyvniť záznam v cache pamäti pre súbor imgview.php?img=1111_1.jpg či pre súbor imgview.php?img=1111_1.jpg&reload=2. Že pre PHP interpreta to je ten istý súbor je už iná vec. Prečítal si si vôbec to odkazované vlákno v [#4]?
hunter_dave
Profil
_es:
No a keď bude v cache pamäti, ako prehliadač zistí, či sa súbor zmenil - zase to musí prehliadač buď znova načítať, alebo použiť starú verziu obrázka.
To nezjistuje prohlizec .. to zjistuju ja pomoci php .. a pokud se zmenil tak chci odeslat pomoci hlavicek prohlizeci ze ma dany soubor refreshnout .. obrazky sou php .. to znamena ze to ve skutecnosti je serverovy script ktery se jenom odesle jako obrazek .. takze vsechno se tam da zjistit .. zmena obrazku, to reload .. by tam bylo aby se to presmerovalo na spravny .. a nebo muzu zapsat obrazky na zmenu do session .. to druhe vlakno uz vypada lip ale nvm jestli je to presne to co hledam .. kazdopadne diky ...
_es
Profil
hunter_dave:
To nezjistuje prohlizec .. to zjistuju ja pomoci php
Ako chceš v PHP zisťovať, čo si prehliadač uložil do cache?

a pokud se zmenil
A to je ten zásadný problém - ako prehliadač zistí, že sa ten obrázok na serveri zmenil, dávno skončený PHP skript mu to asi nepovie.

to znamena ze to ve skutecnosti je serverovy script ktery se jenom odesle jako obrazek
To je ale prehliadaču úplne jedno - preňho to je len obyčajný obrázok.

Mal by si sa asi lepšie zamyslieť, čo robí prehliadač a čo robí server.
hunter_dave
Profil
_es:
Ako chceš v PHP zisťovať, čo si prehliadač uložil do cache?
To nechci chci zjistit jestli se obrazek zmenil na serveru a rict prohlizeci aby ho zapsal do cache znovu

A to je ten zásadný problém - ako prehliadač zistí, že sa ten obrázok na serveri zmenil, dávno skončený PHP skript mu to asi nepovie.
To nezjistuje prohlizec .. ale PHP .. a php mu to posle v hlavicce predtim nez skonci

To je ale prehliadaču úplne jedno - preňho to je len obyčajný obrázok.
To já vím taky tam nic o prohlizeci nepisu .. jenom rikam ze na strane serveru diky tomu muzu zjistit jestli se obrazek zmenil a hlavicky muzou byt poslinany zkrz tenhle obrazek. Vážně nevím jak by si poslal hlavicku z nejakeho souboru jpeg.

Mal by si sa asi lepšie zamyslieť, čo robí prehliadač a čo robí server.
Mozna by si se moh nejdriv ty snazit me pochopit nez zacnes neco odpovidat. ;)
_es
Profil
hunter_dave:
To nechci chci zjistit jestli se obrazek zmenil na serveru a rict prohlizeci aby ho zapsal do cache znovu
Komunikácia prebieha tak, že si prehliadač niečo vypýta od servera a nie naopak.
Nič také, ako príkaz prehliadaču, aby si niečo zapísal do cache, neexistuje.
Teda neexistuje ani možnosť príkazu pre server: „Obvolaj všetky prehliadače, ktoré zobrazujú nejaký súbor a prikáž im, aby si ho okamžite aktualizovali.“ To, či sa obrázok na serveri zmenil, zistí prehliadač tak, že si ten súbor zo serveru vyžiada a ak napríklad z hlavičiek zistí, že by malo ísť o ten istý obsah (napríklad pomocou spomenutého ETagu), tak sa (možno) stiahnu len tie hlavičky. No problém je aj to, že prehliadač si ten súbor ani od servera vyžiadať nemusí a môže z cache zobraziť ihneď starú verziu obrázka. Teda isté načítanie nejakého nového obsahu je možné len pomocou novej URL - čo sa dá aj pridaním nejakého parametra za otáznikom v adrese.

a hlavicky muzou byt poslinany zkrz tenhle obrazek
A ten obrázok je predsa posielaný až pri jeho vyžiadaní prehliadačom - teda potom, čo si ho prehliadač vyžiada a keď si ho vyžiada, tak sa domnieva, že ho treba (znovu) načítať a teda je už následok tej príčiny, ktorú sa snažíš riešiť.
hunter_dave
Profil
Tak dobre .. zapomen vsechno co sme tu probirali .. chci donutit prohlizec .. nebo alespon vetsinu prohlizecu .. jako je firefox, IE, chrome, opera, safari .. tyhle zakladni .. aby si ten soubor vyzadali .. proto sem chtel poslat v hlavicce header("Expires: -1"); (to by melo zajistit aby se obrazek obnovil) .. po provedeni zmen se obrazky na strance zobrazi .. to znamena ze se provede PHP script a zobrazi ty obrazky, takze logicky se odesle i hlavicka obsazena v tom php obrazku. Nechapu proc tohle nefunguje.

Jestli se ptas proc nechci pouzit tu zmenu url obrazku, tak je to proto, že na stránce s galerií potřebuju mít ty samé obrázky se stejnou adresou, nově zapsané v cachi.
_es
Profil
hunter_dave:
proto sem chtel poslat v hlavicce header("Expires: -1"
Nechapu proc tohle nefunguje
Ak by to aj fungovalo, v čom by sa to líšilo od Cache-control: no-cache, čo píšeš, že nechceš?
Používaš vôbec ten PHP skript ako <img src="imgview.php?img=1111_1.jpg">?

po provedeni zmen se obrazky na strance zobrazi
Ako sa tie zmeny prevedú a ako a kedy sa tie obrázky majú znovu zobraziť?
Dodaj, ako vyzerá HTML kód a kde sa tam tie obrázky nachádzajú, či ako ich zobrazuješ, najlepšie „živú“ ukážku.
hunter_dave
Profil
<?php

$img=$_GET["img"]; 

$imagepath = '../catalog/'.$img.'.jpg';
$watermarkpath = 'watermark.png';
$Xplus = 0;
$Yplus = 0;
$Xalign = "middle";
$Yalign = "middle";

if(!file_exists($imagepath)){
header("Content-type: image/png");
$imagepath = "default.jpg";
$image = imagecreatefromjpeg($imagepath);
imagepng($image);
}
else{

$image = imagecreatefromjpeg($imagepath); 
$watermark = imagecreatefrompng($watermarkpath);

list($watermarkWidth, $watermarkHeight) = getimagesize($watermarkpath); 
list($imageWidth, $imageHeight) = getimagesize($imagepath); 

if($imageWidth>1024){
$mc_resize_width="1024"; 

$mc_new_width = $mc_resize_width;
$mc_new_height = $imageHeight*($mc_resize_width/$imageWidth);

$mc_thumb = ImageCreateTrueColor($mc_new_width, $mc_new_height);
ImageCopyResampled($mc_thumb,$image,0,0,0,0,$mc_new_width,$mc_new_height,$imageWidth,$imageHeight); 
$image=$mc_thumb;
$imageWidth=$mc_new_width;
$imageHeight=$mc_new_height;
}
if($_GET["mini"]=="1"){
$mc_resize_height="160"; 

$mc_new_height = $mc_resize_height;
$mc_new_width = $imageWidth*($mc_resize_height/$imageHeight);

$mc_thumb = ImageCreateTrueColor($mc_new_width, $mc_new_height);
ImageCopyResampled($mc_thumb,$image,0,0,0,0,$mc_new_width,$mc_new_height,$imageWidth,$imageHeight); 
$image=$mc_thumb;
$imageWidth=$mc_new_width;
$imageHeight=$mc_new_height;
}

if($imageWidth>$imageHeight){
$mc_resize_height=$imageHeight; 

$mc_new_height = $mc_resize_height;
$mc_new_width = $watermarkWidth*($mc_resize_height/$watermarkHeight);

$mc_thumb = ImageCreateTrueColor($mc_new_width, $mc_new_height);
$transparency = imagecolorallocatealpha($mc_thumb, 255, 255, 255, 127);
imagefill($mc_thumb, 0, 0, $transparency);  
ImageCopyResampled($mc_thumb,$watermark,0,0,0,0,$mc_new_width,$mc_new_height,$watermarkWidth,$watermarkHeight); 
$watermark=$mc_thumb;

$watermarkWidth=$mc_new_width;
$watermarkHeight=$mc_new_height;
}
else{
$mc_resize_width=$imageWidth; 

$mc_new_width = $mc_resize_width;
$mc_new_height = $watermarkHeight*($mc_resize_width/$watermarkWidth);

$mc_thumb = ImageCreateTrueColor($mc_new_width, $mc_new_height);
$transparency = imagecolorallocatealpha($mc_thumb, 255, 255, 255, 127);
imagefill($mc_thumb, 0, 0, $transparency);  
ImageCopyResampled($mc_thumb,$watermark,0,0,0,0,$mc_new_width,$mc_new_height,$watermarkWidth,$watermarkHeight); 
$watermark=$mc_thumb;

$watermarkWidth=$mc_new_width;
$watermarkHeight=$mc_new_height;
}

$x = 0; 
$y = 0; 
 
if($Xalign == "middle"){
 $x = $imageWidth/2 - $watermarkWidth/2 + $Xplus; 
 } 
if($Xalign == "left"){
 $x = 0 + $Xplus; 
 } 
if($Xalign == "right"){
 $x = $imageWidth - $watermarkWidth - $Xplus; 
 } 
if($Yalign == "middle"){ 
 $y = $imageHeight/2 - $watermarkHeight/2 + $Yplus; 
 }
if($Yalign == "top"){
 $y = 0 + $Yplus;
 } 
if($Yalign == "bottom"){
 $y = $imageHeight - $watermarkHeight - $Yplus; 
 }

imagecopy($image, $watermark, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight);  

header("Content-type: image/png");
Header ("Last-Modified: " . gmdate("D, d M Y H:i:s",mktime (0,0,0,1,1,2000)) . " GMT");
Header ("Expires: ".gmdate("D, d M Y H:i:s",mktime(0,0,0, date(m), date(d)+7,date(Y))) . " GMT");
Header ("Cache-Control: max-age=10000000, s-maxage=1000000, proxy-revalidate, must-revalidate");
imagepng($image);
}
?>

- zobrazeni obrazku , pripadne miniatury, s vodotiskem - zapis do cache
obrazek se zobrazuje po prepsani jmen obrazku .. ten kod je dlouhy .. nebudu ho tu vypisovat .. s tim ani problem nemam .. potrebuju nejak upravit ten kod obrazku .. aby se po nejake akci (konkretne prepsani jmena toho obrazku) nacetla nova verze ...
do cache to zapisuju takto:
Header ("Last-Modified: " . gmdate("D, d M Y H:i:s",mktime (0,0,0,1,1,2000)) . " GMT");
Header ("Expires: ".gmdate("D, d M Y H:i:s",mktime(0,0,0, date(m), date(d)+7,date(Y))) . " GMT");
Header ("Cache-Control: max-age=10000000, s-maxage=1000000, proxy-revalidate, must-revalidate");

zivou ukazku si muzes vyzkouset zde .. prihlas se jako uzivatel test s heslem : heslo
a potom klikni Sem .. budes upravovat obrazky produktu test .. kdyz na ne najedes .. objevise home a krizek .. home .. nastavit jako vychozi .. krizek smazat .. pokud nastavis obrazek jako vychozi ... nic se nestane protoze v cachi sou stare obrazky .. stejne tak kdyz se potom podivas do galerie
po refreshnuti stranky se obrazky zapisou do cache znovu .. a vse je jak ma...
_es
Profil
hunter_dave:
Prečo to nespravíš nejako normálne?
Myslíš, že návštevník ocení, že pohyb myši nad obrázkami vyvoláva neustále požiadavky na server na opakované sťahovanie súborov image_title.png, image_delete.png a image_spliter.png?

potrebuju nejak upravit ten kod obrazku .. aby se po nejake akci (konkretne prepsani jmena toho obrazku) nacetla nova verze ...
To nestačí len cez JS prehodiť názvy súborov v objektoch obrázkov na načítanej stránke? A to po nejakom potvrdení premenovania od servera a bez načítavania obrázkov.

Celý ten nápad s „prehadzovaní názvov“ a požiadavkou, aby sa prehliadač nejakými tajomnými spôsobmi dozvedel, že boli názvy prehodené a len kvôli tomu musel znova sťahovať už načítané obrázky, je pochybný. Sprav to tak, že unikátny obsah je priradený k unikátnemu názvu a nebudeš musieť riešiť podobné problémy.
hunter_dave
Profil
_es:
Myslíš, že návštevník ocení, že pohyb myši nad obrázkami vyvoláva neustále požiadavky na server na opakované sťahovanie súborov
Tohle se odehrava na strane klienta .. rika se tomu javascript .. obrazky se stahnou pouze poprve do cache a sou to jen male ikony .. neres prosim jak resim vzhled apod .. zamer se na problem kvuli kteremu jsem toto vlakno zalozil

Vim ze by to slo jinak .. ale ja se to snazim udelat takto protoze uz jsem to na tom postavil .. pokud se reseni nenajde udelam to lepe .. ale ted zrovna mi prijde lepsi kdyz to vyresim par hlavickama v jednom souboru nez pak prepisovat vsechny stranky kde se obrazky objevuji viz .. kosik, souhrn, vyhledavani, kategorie, detail produktu, apod ...
_es
Profil
hunter_dave:
obrazky se stahnou pouze poprve do cache
Lebo si to už nejako opravil.

ale ted zrovna mi prijde lepsi kdyz to vyresim par hlavickama v jednom souboru
Nevyriešiš (rozumne).
Mne zase príde lepšie opustiť jeden nezmyselný nápad, než riešiť 100 problémov, ktoré to môže spôsobiť, napríklad nútiť návštevníka sťahovať už stiahnuté obrázky, znemožniť jeho prehliadaču rozumne používať cache pamäť atď. a to len preto, že mal programátor extravagantný nápad s pomenovaním súborov.
hunter_dave
Profil
_es:
môže spôsobiť, napríklad nútiť návštevníka sťahovať už stiahnuté obrázky, znemožniť jeho prehliadaču rozumne používať cache pamäť atď.
To asi tezko .. a nenutim ho stahovat stary obrazek ale novou verzi

Lebo si to už nejako opravil.
Je to uplne stejne .. a taky by me zajmalo jak si vubec prisel na to ze po najeti mysi muze javascript na strane klienta zapisovat na server bez ajaxu? A proč bych to asi dělal ..
_es
Profil
hunter_dave:
a nenutim ho stahovat stary obrazek ale novou verzi
Nútiš - musí sťahovať dva staré obrázky len kvôli tomu, že sa na serveri zmenili ich názvy - to „prehodenie“ názvov súborov. A to dokonca pri každej návšteve stránky, lebo smeruješ k riešeniu s rovnakým efektom ako Cache-control: no-cache.
jak si vubec prisel na to ze po najeti mysi muze javascript na strane klienta zapisovat na server bez ajaxu?
Kde som niečo také písal? Len sa pri pohybe myši prehliadač neustále opakovane pokúšal sťahovať tie tri, už stiahnuté, obrázky. Aktualizoval som včera Firefox na verziu 8.0, takže ak si kód nijako neupravoval, možno sa to prejavuje len v staršej verzii.
Chamurappi
Profil
Reaguji na huntera_dave:
Chci se zeptat jestli se pomocí php nějak nedá říct prohlížeči .. aktualizuj cache obrázků
Pokud bys měl obrázky v odděleném dokumentu (třeba uvnitř <iframe>), tak v něm můžeš zavolat location.reload(true) a prohlížeč by měl načíst (a nakešovat) aktuální verze všeho. Samozřejmě ale musíš mít nějaký způsob, jak klientovi říct, že má tenhle JS zavolat — v čemž je asi hlavní háček.
_es
Profil
Chamurappi:
můžeš zavolat location.reload(true) a prohlížeč by měl načíst (a nakešovat) aktuální verze všeho.
Vzťahuje sa to aj na všetky externé súbory v dokumente? Netýka sa to len HTML súboru? V iframe môže byť aj len obrázok, aj vtedy ide tú metódu zavolať.
hunter_dave
Profil
Chamurappi:
jak klientovi říct, že má tenhle JS zavolat — v čemž je asi hlavní háček.
To problém není stačí si pomocí php vypsat do url iframu nejakou promenou .. diky moc tohle by mi melo vyresit problem s nacitanim okna 2x .. mel jsem to vyreseny pomoci hlavicky header("Refresh : 0.1") nenapadlo mě dát obrázky do iframu .. teď mám, ale ještě problém s tím, že starší IE ty obrázky po refreshy nenačte .. až na podruhý ... a nechce se mi to zbytečně dělat 2x
hunter_dave
Profil
Ještě mě napadlo jestli by to nešlo pomocí preload obrázku pomocí js? Zapíše prohlížeč do cache po preloadu?
hunter_dave
Profil
Něco jako
picture = new Image();
picture.src = "image.jpg";

Zapíše se to do cache znovu?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0