Jak uniknąć buforowania podczas programowania?


31

Czy istnieje prosty sposób, aby zapobiec buforowaniu podczas testowania wyglądu zmian w witrynie? Używam WP Super Cache. Mogę usunąć jego pamięć podręczną za pomocą podanej opcji, usunąć pamięć podręczną mojej przeglądarki, a niektóre zmiany w css lub widżetach nie odświeżają się. Wypróbowuję inne obejścia, takie jak przełączanie przeglądarek lub komputerów, ale musi istnieć bardziej liniowy przepływ pracy, w którym mogę się upewnić, że przeglądam wprowadzone zmiany, a nie jakiś wcześniejszy format z pamięci podręcznej? Jakie jest na to najlepsze rozwiązanie?


Wygląda na to, że jest też kilka wtyczek do zrobienia tego dla CSS. Czy to naprawdę konieczne? Czy te wtyczki robią coś, czego nie robi czyszczenie pamięci podręcznej przeglądarki?
cboettig 30.01.12

W moim przypadku okazało się, że muszę wyczyścić pamięć podręczną utworzoną przez dostawcę DNS (cloudflare). Dziękuję wszystkim za poniższe sugestie.
cboettig

Używam przeglądarki Chrome; Przydaje się okno incognito, gdy napotykam problemy z pamięcią podręczną na poziomie przeglądarki podczas programowania.
Joseph Kulandai,

Mam nadzieję, że ta wtyczka pomoże ci: wordpress.org/plugins/prevent-browser-caching
Kostya Tereshchuk

Odpowiedzi:


32

Dodaj filemtime()swój arkusz stylów jako parametr wersji. Powiedzmy, że domyślny arkusz stylów jest w ( css/default.cssi nie ). Kiedy rejestrujemy arkusz stylów w ( nie ), możemy przekazać wersję jako czwarty parametr. To będzie czas ostatniej modyfikacji i dlatego zmieniamy się za każdym razem, gdy zmieniamy plik.css/default.min.cssstyle.csswp_loadedinit

$min    = WP_DEBUG ? '': '.min';
$file   = "/css/default$min.css";
$url    = get_template_directory_uri() . $file;
$path   = get_template_directory() . $file;
$handle = get_stylesheet() . '-default';

// Overridden?
if ( is_child_theme() && is_readable( get_stylesheet_directory() . $file ) )
{
    $url  = get_stylesheet_directory_uri() . $file;
    $path = get_stylesheet_directory()     . $file;
}

$modified = filemtime( $path );

add_action( 'wp_loaded', function() use ( $handle, $url, $modified ) {
    wp_register_style( $handle, $url, [], $modified );
});

add_action( 'wp_enqueue_scripts', function() use ( $handle ) {
    wp_enqueue_style( $handle );
});

Jeśli używasz Node.js i Grunt, zdecydowanie polecam Browsersync . Będzie oglądać twoje pliki i aktualizować je natychmiast, gdy tylko się zmienią. Może również synchronizować pozycję przewijania, przesyłanie formularzy i więcej w wielu otwartych przeglądarkach. Bardzo fajny.


Wielkie dzięki. Wygląda na to, że jest to również podejście powyższej wtyczki. Nie rozwiązało to problemu w moim przypadku, ponieważ mój dostawca DNS (CloudFlare) buforował plik css, więc musiałem wyczyścić pamięć podręczną - chyba nie ma na to prostego sposobu. Ogólnie jednak uważam, że jest to najlepsza odpowiedź na tego rodzaju problem, więc oznaczę, że został zaakceptowany. Dzięki jeszcze raz.
cboettig

Dlaczego nie używasz lokalnego arkusza stylów podczas programowania?
fuxia

Niektóre usługi buforowania w chmurze utrudniają buforowanie pliku przez ponad 8 godzin, więc albo musisz poprosić je o wdrożenie lepszej usługi kontroli wersji (niektóre to robią), zmienić usługi lub przestać ich używać.
Wyck

@cboettig CloudFlare ma ustawienie trybu deweloperskiego, który zatrzyma buforowanie na 3 godziny. Następnie automatycznie wznawia buforowanie po 3 godzinach.
Gilbert

7

Po wielokrotnym poszukiwaniu prostego rozwiązania postanowiłem znaleźć coś, co działa!

więc ... po przemyśleniu znalazłem świetny sposób na zastąpienie buforowania podczas tworzenia nowych stron internetowych ... (i jest to łatwe).

Potrzebujemy powiedzieć wp, że to nowa wersja CSS taka jak ta ...

Przed zmianami:

wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css', array(), false, 'all' );

Po zmianach:

wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css?v='.time(), array(), false, 'all' );

Oto co dodaliśmy:

?v='.time()

Objaśnienie:
Zasadniczo dodajemy dynamiczny numer wersji do pliku css, który zmusza przeglądarkę do ładowania nowego css za każdym razem, gdy go aktualizujemy.

Nie zapomnij go usunąć po zakończeniu programowania, w przeciwnym razie buforowanie nie będzie działać dla tego pliku i będzie się ładować w przypadku powracających użytkowników.

Ta technika działa dla plików css & js - mam nadzieję, że to pomoże;)


Całkiem fajnie, ale lepiej, po prostu użyj time () w czwartym parametrze, którym jest wersja. Co dałoby ci:wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css', array(), time(), 'all' );
Dave

Użycie czasu jako czwartego parametru może sprowokować chrome do utrzymania tej wersji. Jest to szczególnie prawdziwe, jeśli buforujesz wszystko inne podczas pracy na stronie na żywo. W ten sposób wysyłasz „nowy plik” do chrome, którego użyłby zamiast próbować zachować tę „starą” wersję przez pewien czas (ustawiony dla innych zasobów).
Sagive SEO

Nie, działa dobrze w chromie, używałem go wczoraj.
Dave

oznacza to, że nie ustawiłeś czasu buforowania / wygaśnięcia w swoim htaccess lub za pomocą wtyczki. Ale cokolwiek Ci odpowiada;)
Sagive SEO

6

Może się to wydawać zbyt proste, ale co powiesz na wyłączenie buforowania, dopóki nie skończysz części programistycznej witryny? Włączanie i wyłączanie jest więcej niż proste.


2
+1 - Używam paska narzędzi „Web Developer” dla Firefoksa, pozwala bardzo szybko wyłączyć pamięć podręczną (między innymi)
Shane

Dzięki - czy konieczne jest jedynie wyłączenie pamięci podręcznej przeglądarki? Czy WP superCache nadal będzie zapewniać zawartość w pamięci podręcznej? Nawet moja usługa DNS buforuje, więc nie jestem pewien, czy muszę osobno wyłączać każdą pamięć podręczną (WP, przeglądarkę, DNS itp.).
cboettig

Sorta zależy, będziesz musiał się z tym bawić i dowiedzieć się, co musisz zrobić dla swojej konfiguracji.
mor7ifer

Jestem z nim, po prostu wyłącz to, to właśnie robię.
mat

4

Wiem, że na to pytanie została zaakceptowana odpowiedź, ale myślę, że ta odpowiedź jest wciąż zbyt skomplikowana dla danego problemu i może faktycznie być niepoprawna w zależności od użytkownika (choć bez obrazy), więc pomyślałam, że nadal podzielę się jak omijam buforowanie, kiedy robię programistę (nie tylko w Wordpress).

Większość współczesnych przeglądarek ma tak zwany tryb incognito . W tym trybie nic na komputerze nie jest buforowane, więc każde odświeżenie to pobranie nowego serwera z serwera. W Internet Explorerze naciskasz Ctrl + Shift + P. W Firefox i Chrome naciskasz Ctrl + Shift + N.

Jeśli twoja przeglądarka nie ma trybu incognito, możesz normalnie wymusić twarde przeładowanie, naciskając Ctrl + F5na IE, lub Ctrl + Shift + Rna Firefox i Chrome.

Jeśli chodzi o pytanie dotyczące plików CSS (i zasadniczo wszystkich plików zasobów, takich jak obrazy i pliki JavaScript), nie są one buforowane w żaden sposób przez WP Super Cache. Twoje ustawienia i / lub użycie tej wtyczki nie wpływa na sposób udostępniania tych plików. To, co buforuje te pliki, to przeglądarka , i to jest powód, dla którego dokonujesz twardego przeładowania.

Wtyczka ocenia, w jaki sposób Wordpress buduje pliki HTML (przez PHP) i przechowuje kopię, dzięki czemu następnym razem, gdy ktoś poprosi o ten sam post, stronę lub cokolwiek innego, wyświetla kopię i nie będzie musiał ponownie sprawdź HTML wygenerowany przez PHP, a tym samym zaoszczędź czas na obliczeniach, ładując strony o wiele szybciej. (Mam nadzieję, że to jasne.)

Problem polega na tym, że jeśli klapiesz znacznik czasu w adresie URL swoich plików CSS za pomocą funkcji PHP, to jest ocena PHP do HTML, i która będzie buforowana przez WP Super Cache. Każde żądanie do tego samego postu będzie miało ten sam znacznik czasu, ponieważ użytkownikom dostarczana jest kopia oryginalnej oceny znacznika czasu. (Popraw mnie, jeśli się mylę.)

Prawidłowym sposobem na ominięcie buforowania WP Super Cache jest ustawienie opcji Don't cache for known usersna truestronie ustawień wtyczki.

Wreszcie (i jest to osobista preferencja, ponieważ jestem prawdziwym zwolennikiem kodowania), uciekanie się do incognito lub wymuszonego twardego przeładowywania nie będzie wymagało dodawania niepotrzebnych znaczników na stronach HTML. Oczywiście dodanie znacznika czasu dodaje tylko około 13 bajtów na plik statyczny na żądanie, ale hej, jak powiedziałem, jestem zwolennikiem tego rodzaju rzeczy. Nadal 13 bajtów jest niepotrzebnych.


Dzięki za przydatne wskazówki. Niestety, żadna z odpowiedzi tutaj nie jest poprawna w moim przypadku, ponieważ moje rozwiązanie wymagało wyczyszczenia pamięci podręcznej dostawcy usługi sieci domenowej, cloudflare, ale wiele z nich nadal było dobrych informacji.
cboettig

2

Boże, wiele sposobów na odpowiedź na to pytanie! Przede wszystkim pytałeś o dwie różne rzeczy: WP Super Cache i pliki CSS. Są one buforowane w różny sposób, w różnych miejscach, dlatego ważne jest, aby rozpoznać problem.

Jeśli WP Super Cache, możesz zdefiniować stałą DONOTCACHEPAGEw pliku functions.php podczas programowania, aby zapobiec buforowaniu czegokolwiek przez WP Super Cache. Nie zapomnij jednak usunąć tego podczas uruchamiania!

define('DONOTCACHEPAGE', true);

Każda witryna ma także unikalny klucz, który należy dołączyć do adresu URL, aby załadować nową wersję strony, którą, jak sądzę, można znaleźć na karcie „Zaawansowane”.

Rozbijając go na jeszcze lepsze rozwiązanie, powinieneś rozważyć skonfigurowanie środowiska programistycznego i produkcyjnego, w którym środowisko programistyczne nie ma włączonej WP Super Cache (ponownie, zakładając, że to twój problem).

Jeśli twój problem dotyczy plików CSS / JS, zobacz odpowiedź toscho i kolejny komentarz m0r7if3r powyżej.


1

HyperCache wyłącza buforowanie, gdy jesteś zalogowany jako administrator. Nie jestem pewien, czy WP Super Cache ma taką samą funkcjonalność.


Jest na to opcja, tak.
Matthew Boynes

1

Jeśli używasz przeglądarki Chrome (którą gorąco polecam), otwórz Inspektora, kliknij ikonę ustawień w prawym dolnym rogu i w sekcji „Sieć” wybierz „Wyłącz pamięć podręczną”.



-1

Możesz użyć tego fragmentu https://gist.github.com/jhayiwg/92bae4330aeb738a98022d7ab63ce9b1

Będzie generować nową wersję aktywnego motywu css i js za każdym razem, gdy załadujesz stronę


Proszę opublikować odpowiedź tutaj, w tym cały odpowiedni kod. Korzystaj z zewnętrznych stron wyłącznie w celach informacyjnych. Twój post powinien zawierać pełną odpowiedź bez potrzeby przechodzenia na inną stronę; jeśli strona zewnętrzna przestanie działać, twoja odpowiedź będzie
bezużyteczna
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.