Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z cache opery
Forum PHP.pl > Forum > Po stronie przeglądarki
konraddo
Pytanie dotyczy projektu sklepu internetowego nad którym właśnie pracuję, a dokładniej koszyka i cache opery
dodam że mini-zawartośc koszyka jest wyświetlana na głównym lay'oucie, wiec jest pokazywany na każdej podstronie
Strona ładnie działa pod ie oraz pod ff, ale problem jest z operą
Kiedy się przegląda ofertę wybieramy produkt i dodajemy go do koszyka, do tej pory wszystko jest ok
kiedy zaczynamy przeglądać dalej ofertę powracamy na stronę gdzie już byliśmy, ale wtedy opera ładuje stronę ze swojego cache'u wraz z zawartością mini-koszyka, co jest błędem bo prawdziwa zawartość koszyka jest już inna, niż ta którą załadowała opera

jak zrobić by opera za każdym razem sprawdzała aktualność strony, lub jej części?

pod przeglądarkami ff oraz ie wszystko działa w porządku, tylko ta opera....

ustawienia opery mam standardowe
wersja: 9.24
kevinsz
Wiem o czym mówisz, też mnie to czasem irytuje, kiedy wiem, że zawartość strony na pewno się zmieniła, a Opera wrzuca mi starą treść smile.gif No i dopiero "Odśwież" załatwia sprawę. Nie wiem, czy będzie to działało, ale dokumentacja PHP podaje takie rozwiązanie, aby zabronić cache'owania (wywołanie na początku skryptu):
  1. <?php
  2. header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
  3. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
  4. ?>
konraddo
niestety pomimo obecności tych headerów, opera dalej pobiera nieaktualne strony z cache

zestaw headerów:
  1. <?php
  2. header('Pragma: public');
  3. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past  
  4. header('Cache-Control: no-store, no-cache, must-revalidate');  // HTTP/1.1
  5. header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
  6. ?>


także nie wywierają żadnego wpływu

czy ustawienie headera:
header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
powoduje że sprawdzana jest grafika strony czy również kod html, czy jedno i drugie?

czy opera pomija te nagłówki?

meta tagi też niczego nie zdziałły:
  1. <meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
  2. <meta http-equiv="PRAGMA" content="NO-CACHE">


ale żeby było ciekawiej odświeżenie strony też niczego nie daje
dalej są wyświetlane nieaktualne informacje, dopiero po wyczyszczeniu cache i ponownym uruchomieniu przeglądarki wyświetlane podstrony są prawidłowo wyświetlane
szefoski
Komus udalo sie rozwiazac ten problem?
rapra
witam!
mialem podobny problem z odswiezaniem miniaturek zdjec kadrowanych na innej podstronie. probowalem wszystkich 'sztuczek' znalezionych w google, na przyklad:
Kod
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><BR>
<meta http-equiv="Expires: Mon, 15 Dec 2007 01:00:00 GMT"><BR><meta http-equiv="Last-Modified:'.gmdate("D, d M Y H:i:s").' GMT"><BR>
<meta http-equiv="Cache-Control: no-store, no-cache, must-revalidate"><BR><meta http-equiv="Cache-Control: post-check=0, pre-check=0", false><BR>
<meta http-equiv="Pragma: no-cache">';

oraz
Kod
header( "Expires: Mon, 15 Dec 2007 01:00:00 GMT+0100" );<BR>
header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );<BR>header("Cache-Control: no-store, no-cache, must-revalidate"); //HTTP/1.1<BR>
header("Cache-Control: post-check=0, pre-check=0", false);<BR>header("Pragma: no-cache"); // HTTP/1.0


Na cache IE dziala znakomicie ustawienie mu w opcjach ogolnych ustawien cache opcji "sprawdz czy sa nowsze wersje przechowywanych stron" na "przy kazdej wizycie na stronie", w FF nie ma tego nawet w miare dostepnego, a zmuszanie uzytkownika do szukania po plikach konfiguracyjnych jest bez sensu.

Pomoglo (ale i tak nie na 100% przypadkow) dopiero
Kod
header("refresh: 0; url=kadrowanie.php");
wymuszajacego odswiezenie zawartosci strony.
robie to na 2 sposoby:
1. po zakonczeniu uploadu (nadpisanie) zdjecia w celu wymuszenia odswiezenia miniaturki robie:
Kod
if ($handle->processed){ ...header("refresh: 0; url=kadrowanie.php");}

2. przy przekierowaniu na strone z miniaturkami z okna kadrowania robie stamtad GET:
Kod
header("location:kadrowanie.php?zatwierdz=ok#zdjecie_nr$_POST[zdjecie]");

a na stronie z miniaturkami warunek:
Kod
if ($_GET['zatwierdz']<>'')<BR>
{echo '<BR>
<meta http-equiv="refresh: 0; url=kadrowanie.php"><BR>';}

moze nie jest to metoda finezyjna ale na Firefoxa pomogla (aczkolwiek mimo to zdarza sie nieprzeladowanie miniaturki)
Hazel
Ach, odkopię starego suchara, za złe chyba nikt nie będzie miał.

Namęczyłem się z wyżej wymienionym problemem, ładnych parę miesięcy szukałem, szukałem i nic nie mogłem wymyślić. Opera mająca ustawioną opcję "Sprawdzaj, czy przechowywane strony zostały zmienione na serwerze" na wartość inną niż "zawsze", sprawiała gigantyczne problemy i straciłem już nadzieję, ze da się to rozwiązać. Meta tag "refresh" podany w poście powyżej jest w mojej opinii bardzo złym pomysłem, po pierwsze to nie jest rozwiązanie działające we wszystkich przypadkach (a nawet można zaryzykować stwierdzenie że w niewielu), jest niezgodne ze specyfikacjami, powoduje błędy, a do tego w przeglądarce po zastosowaniu widać brzydkie, niepożądane szybkie odświeżenie. Sposób bardzo ułomny. Znalazłem coś, co idealnie rozwiązuje problem - to znaczy nie mam pewności, że każdy zawsze pod wszystkimi możliwymi przeglądarkami, ale u mnie działa pod Operą, FF, Safari i IE7 przy najróżniejszych ustawieniach cache'u. Wystarczył jeden nagłówek, wysyłany do serwera wraz z żądaniem AJAX. Wcześniejszy kod:

Kod
request.onreadystatechange=respHandle;
request.open(reqType,url,bool);
request.send(null);
 



To oczywiście wysyłanie danych do serwera metodą GET, ale dla POSTu jest analogicznie. Wystarczy to zmienić na:

Kod
request.onreadystatechange=respHandle;
request.open(reqType,url,bool);
request.setRequestHeader('If-Modified-Since', 'Wed, 15 Nov 1995 00:00:00 GMT');
request.send(null);
 




Nagłówek If-Modified-Since, doskonałe (dla mnie, przy mojej konfiguracji) rozwiązanie. Pozdrawiam wszystkich, którzy mieli taki sam problem i którym to pomoże. Data oczywiście nie gra roli, może być dowolna po północy 1 stycznia 1970 roku, może i nawet wcześniejsza może być, ale to nie ma żadnego znaczenia, wystarczy że będzie z przeszłości.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.