Co to są interfejsy API przejściowe?
Opublikowany: 2020-12-16Wydajność witryny często obraca się wokół idei buforowania: przechowywania danych w stanie gotowym i szybciej dostępnym, tak aby były szybciej odtwarzane przez przeglądarki. WordPress Transients API to narzędzie do buforowania i potężny sposób na poprawę wydajności witryn WordPress.
Co to jest buforowanie i dlaczego warto z niego korzystać?
Za każdym razem, gdy przeglądarka żąda strony internetowej, serwer obsługujący musi wykonać wiele złożonych i czasochłonnych obliczeń, co prowadzi do opóźnień. Po wykonaniu zapytania, dzięki technologii cache'owania, serwer może zapamiętać wynik końcowy i po drugim zapytaniu przekazać go do przeglądarki bez konieczności ponownego wykonywania tych samych obliczeń. Dlatego możliwość buforowania i ponownego wykorzystania wcześniejszych zasobów ma kluczowe znaczenie dla optymalizacji wydajności.
Całkiem proste buforowanie zapewnia opcję tymczasowego przechowywania informacji w warstwie buforowania.
Jakie są rodzaje buforowania?
Istnieją różne rodzaje buforowania i używając ich kombinacji, osiągniesz wyższy poziom wydajności.
Buforowanie przeglądarki
Przed otwarciem zawartości strony internetowej Twoja przeglądarka potrzebuje kilku rzeczy, takich jak pliki JavaScript, arkusze stylów, czcionki itp., Które pobiera oprócz zawartości strony.
Jeśli przeglądarka buforuje te pliki, nie będzie potrzeby pobierania ich za każdym razem, gdy wczytujesz witrynę. Ładowanie witryny po raz pierwszy zajmuje zwykle kilka sekund, ale po zapisaniu tych plików przez przeglądarkę czas ładowania ulega znacznemu skróceniu.
Buforowanie serwera
Buforowanie serwera oznacza zapisanie pliku HTML dla określonej strony i użycie go przy każdym kolejnym żądaniu. Jest to tak zwana pamięć podręczna całej strony.
Istnieje inny typ pamięci podręcznej serwera - pamięć podręczna obiektów, która w przeciwieństwie do pamięci podręcznej pełnej strony, buforuje tylko określone bity (fragmenty) informacji.
Buforowanie stron
Uważany za najbardziej efektywną pamięć podręczną. Jego nazwa nie wyjaśnia sposobu, w jaki działa. Kiedy użytkownik „A” odwiedza stronę, witryna ją buduje i zwraca zawartość do przeglądarki użytkownika. Gdy pamięć podręczna strony jest uruchomiona, zawartość tej strony jest zapisywana, więc gdy użytkownik „B” odwiedza tę samą stronę, pamięć podręczna strony odtwarza treść wysłaną wcześniej.
Największą zaletą Page Cache jest to, że buforowana strona powraca prawie w momencie uzyskania dostępu. W rezultacie przetwarzane są miliony żądań, a strony odtwarzane nawet na najsłabszym serwerze o najniższej szybkości pamięci i niewielkim obciążeniu procesora.
Ale ten typ pamięci podręcznej ma również swoje wady: na przykład brak możliwości buforowania stron dla autoryzowanego użytkownika lub użytkownika, którego zawartość strony zależy od aktualnych zmiennych użytkownika.
Buforowanie bazy danych
Buforowanie bazy danych to proces uwzględniony w projektowaniu aplikacji komputerowych, które generują strony internetowe na żądanie (dynamicznie) poprzez dostęp do baz danych zaplecza. Pamięć podręczna bazy danych poprawia podstawową bazę danych, usuwając na nią niepotrzebny nacisk, zazwyczaj w postaci często używanych odczytywanych danych. Sama pamięć podręczna może działać w wielu obszarach, w tym w bazie danych, aplikacji lub jako samodzielna warstwa.
Gdy te aplikacje są wdrażane w środowiskach wielowarstwowych, które obejmują klientów opartych na przeglądarkach, serwery aplikacji internetowych i bazy danych zaplecza, w celu uzyskania wysokiej skalowalności i wydajności używane jest buforowanie bazy danych warstwy środkowej.
Buforowanie obiektów
Buforowanie obiektów w WordPress (pamięć podręczna obiektów) obejmuje przechowywanie zapytań do bazy danych. Jest to wbudowany mechanizm systemowy, który pozwala na składowanie danych (obiektów) dowolnego typu i ich odzyskiwanie w razie potrzeby. Ta pamięć podręczna służy do przechowywania wyników złożonych operacji.
Po włączeniu w witrynie WordPress pomaga przyspieszyć czas wykonywania PHP, szybciej dostarczać zawartość odwiedzającym witrynę i zmniejszyć obciążenie bazy danych.
CDN (sieci dostarczania treści)
Jest to rozproszona geograficznie infrastruktura sieciowa, która zapewnia szybkie dostarczanie treści użytkownikom usług i witryn internetowych. Serwery wchodzące w skład CDN są rozmieszczone geograficznie w taki sposób, aby czas odpowiedzi użytkowników serwisu / usługi był jak najmniejszy.
Co to jest interfejs API Transients w WordPress?
Transients API to sposób na przechowywanie bloku informacji (ciąg kodu, zawartość HTML, WP_Query Objects, JSON) w bazie danych witryny, w przeciwieństwie do buforowania przeglądarki. Transients API jest bardzo podobne do Options API, ale główna różnica polega na tym, że Transients API ma określony czas wygaśnięcia lub lepszą żywotność.
Trzy główne operacje dla stanów przejściowych to ustawianie wartości, pobieranie wartości i usuwanie wartości :
1. Ustaw przejściowy -
set_transient (klucz $, wartość $, $ wygasa);
Aby ustawić stan przejściowy, możesz użyć funkcji set_transient (), która ma trzy składniki:
- Klucz - krótka, unikalna nazwa przejściowa. Musi mieć maksymalnie 172 znaki.
- Wartość - Dowolny typ zmiennej PHP, która zawiera informacje, które będą przechowywane w bazie danych.
- Czas wygaśnięcia (żywotność) - czas, przez który informacje będą przechowywane.
Na przykład, jeśli chcemy zapisać nasze zapytanie o posty na jeden dzień:
set_transient ('unique_listing_posts_query_results_name',$ list_posts_query_results, DAY_IN_SECONDS);
Jak widać, użyliśmy jednej (DAY_IN_SECONDS) z kilku stałych czasowych wprowadzonych w WordPress 3.5 do łatwego wyrażania czasu. Oto pełna lista wszechczasów:
MINUTE_IN_SECONDS = 60 (sekund) HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
2. Uzyskaj przejściowy -
get_transient ($ key);
Aby uzyskać zapisany stan przejściowy, możemy użyć
get_transient ($ transient_name);
W naszym przypadku moglibyśmy pobrać nasze posty zawierające wyniki zapytań za pomocą:
get_transient ( 'unique_listing_posts_query_results_name' );
Zobaczymy więcej na ten temat w dalszej części naszej przykładowej sekcji.
3. Usuń przejściowy -
delete_transient (klawisz $);
Jak wyjaśniliśmy w poprzednich podrozdziałach, możemy używać API Transients do pobierania i przechowywania zdalnych lub lokalnych (zawartość lub zapytanie z naszej bazy danych) odpowiedzi do naszej bazy danych.
Jednak pojawia się pytanie, w jaki sposób usuwamy starą przechowywaną zawartość (przejściowo). Istnieją dwa sposoby czyszczenia (usuwania) stanów przejściowych:
Automatyczne usuwanie
Fajną rzeczą w przejściach jest to, że wygasają automatycznie, jeśli ustawimy czas wygaśnięcia (żywotność) . Jeśli spróbujesz odzyskać przejściowy plik z bazy danych po jego wygaśnięciu, WordPress automatycznie go usunie, zapobiegając bałaganowi. Przejściowy zostanie odtworzony, gdy ktoś otworzy witrynę. W ten sposób upewniamy się, że mamy świeżą zawartość ze zdalnego lub lokalnego API.
Ręczne usuwanie
Czasami będziemy musieli zmusić przejściowy do wczesnej śmierci, ręcznie usuwając go. Jest to przydatne, gdy dana czynność (dodanie nowej pozycji menu, zapisanie lub aktualizacja postu, dodanie lub aktualizacja kategorii itp.) Spowoduje, że dane w pamięci podręcznej będą z natury nieaktualne i wymagają aktualizacji:
Funkcja, której musimy użyć, to
delete_transient ($ transient_name)
aw naszym przypadku powinno to być:
delete_transient ( 'unique_listing_posts_query_results_name' );
Uwaga: ważne jest, aby NIE używać stanów nieustalonych do przechowywania cennych danych, których nie można odtworzyć!
Dlaczego powinniśmy używać interfejsów API przejściowych?
Możemy używać interfejsu API Transients, gdy mamy wartość wymagającą dużej mocy obliczeniowej, która nie zmienia się zbyt często i którą chcesz buforować. W WordPress będzie to zwykle obiekt wynikowy z zapytania do bazy danych, ale tak naprawdę może to być wszystko, co przechowałbyś w zmiennej, czy to wartość skalarna, tablica czy obiekt.
Tak więc wszystkie transjenty są świetne, gdy wykonujesz złożone zapytania w swoich motywach i wtyczkach.

Korzyści z buforowania odpowiedzi zdalnych lub lokalnych
Zdalne odpowiedzi API
Zdalne interfejsy API zawsze wykonują kilka wywołań lub żądań do serwerów zdalnych i występuje dodatkowe opóźnienie. To wymaga czasu i powoduje opóźnienia. Ponadto niektóre zdalne interfejsy API mogą mieć limity szybkości, co oznacza, że możesz osiągnąć maksymalny limit żądań w danym okresie.
Jak już wiesz, możemy skorzystać z Transients API, aby buforować odpowiedź (wynik) ze zdalnego serwera i przechowywać ją w naszej bazie danych. Teraz możemy użyć
get_transient ();
i pokaż przechowywany (zapisany w pamięci podręcznej) wynik / zawartość w razie potrzeby bez wykonywania innych zdalnych wywołań lub żądań.
Wszystko to:
- Zmniejsz liczbę zdalnych wywołań i żądań HTTPS
- Zmniejsz użycie serwera procesora
- Popraw czas ładowania strony internetowej
Odpowiedzi lokalnego interfejsu API
- w zasadzie HTML lub wyniki zapytania z bazy danych. Możesz użyć interfejsu API Transients nie tylko do buforowania zdalnych odpowiedzi, ale także do przechowywania treści HTML lub wyników zapytań w lokalnej bazie danych. Jest to bardzo przydatne, jeśli chcesz wyświetlić powtarzalną sekcję HTML w swojej witrynie (widżety, suwaki, menu itp.) Lub po prostu zapobiec uruchamianiu złożonych lub powolnych zapytań do bazy danych za każdym razem, gdy ktoś odwiedza Twoją witrynę.
Gdzie i kiedy używać stanów przejściowych?
- Złożone i niestandardowe zapytania do bazy danych
- Menu nawigacyjne WordPress
- Widżety paska bocznego, które wyświetlają informacje, takie jak; tweety, lista ostatnio odwiedzających witrynę lub lista postów z określonej kategorii
- Buforowanie chmur tagów
- Buforowanie zewnętrznych żądań HTTP
Zastosowanie i przykłady
Po tylu wyjaśnieniach czas na prawdziwe przykłady.
Podstawowe użycie
function get_my_data () { $ data = get_transient ('my_transient_name'); if (false === $ data) {// Transient wygasł / nie został ustawiony $ dane = fetch_my_data (); // Pobierz dane z oryginalnego źródła set_transient ('my_transient_name', $ data, HOUR_IN_SECONDS); } return $ data; }
Funkcja fetch_my_data () może przechowywać obiekt WP_Query, dane json, zawartość html itp.
Podstawowy przykład
Jak już wyjaśniliśmy, ten typ buforowania jest dobry do zapisywania wyników długich operacji, a najprostszym przykładem jest dostęp do zewnętrznych interfejsów API, takich jak Facebook.
Wyobraź sobie, że mamy następującą funkcję, która uzyskuje dostęp do interfejsu API Facebooka, żąda obiektu (a dokładniej strony) your-website.url i zwraca liczbę polubień strony:
function get_facebook_likes () { $ wynik = wp_remote_get ('https://graph.facebook.com/your-website.url'); $ wynik = json_decode (wp_remote_retrieve_body ($ wynik)); zwraca $ wynik-> polubienia; } echo "Facebook lubi:". get_facebook_likes ();
Czas wykonania tej funkcji zależy od wielu czynników, w tym lokalizacji Twojego serwera względem serwerów Facebooka, statusu i szybkości sieci itp. Przeciętnie funkcja może zająć 1-3 sekundy.
Oznacza to, że korzystając z tej funkcji w serwisie, czas ładowania każdej strony wydłuży się o 1-3 sekundy. Co więcej, jeśli wywołasz tę funkcję więcej niż 500 razy w ciągu 500 sekund, Facebook zamiast wyniku zacznie generować błąd.
Aby przyspieszyć tę funkcję, możemy skorzystać z WordPress Transients API i zapisać wynik przez 1 godzinę:
function get_facebook_likes () { if (false === ($ Likes = get_transient ('fb_likes'))) { $ wynik = wp_remote_get ('https://graph.facebook.com/your-website.url'); $ wynik = json_decode (wp_remote_retrieve_body ($ wynik)); $ lubi = $ wynik-> lubi; // Ustaw przejściowy na godzinę w sekundach set_transient ('fb_likes', $ lubi, 1 * HOUR_IN_SECONDS); } powrót $ polubień; }
Tak więc przy pierwszym wywołaniu tej funkcji, po otrzymaniu zapytania z Facebooka, WordPress zapisze wynik do bazy danych, aw przyszłości zwróci ten wynik z bazy danych przez godzinę bez wielokrotnego wysyłania żądań do serwera Facebooka. Po godzinie funkcja ponownie przełączy się na Facebooka w celu uzyskania danych.
Przy takim podejściu tylko jedno wywołanie tej funkcji na godzinę zwiększy czas żądania o 1-3 sekundy, a kolejne wywołania będą realizowane natychmiast.
Bardziej złożony przykład
Wyobraź sobie, że mamy stronę internetową z około 100 kategoriami i około 50 000 postów, a w projekcie pojedynczego posta na stronie mamy widżet, który pokazuje N powiązanych postów z kategorii, w której znajduje się aktualny post. Zgodnie z oczekiwaniami pobranie wyniku z bazy danych i wyświetlenie go w witrynie internetowej zajmie trochę czasu temu złożonemu zapytaniu.
Teraz wyobraź sobie, że masz 10 000 użytkowników, którzy jednocześnie uzyskują dostęp do serwisu. Oznacza to, że będziemy mieć ponad 10 000 żądań bazy danych, które będą musiały wykonać zapytanie (jest to złożone zapytanie, ponieważ przeszukiwałoby tabele wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts , więc jest ich więcej niż 10 000 zapytań), aby uzyskać wynik dla N postów z pokrewnej kategorii i pokazanie ich na frontend. To z kolei spowodowałoby przeciążenie bazy danych i opóźnienie ogólnego czasu ładowania strony internetowej, aw niektórych przypadkach nawet jej awarię z powodu przeciążenia bazy danych.
I tu pojawia się pytanie, w jaki sposób możemy zoptymalizować i zmniejszyć liczbę zapytań i żądań do bazy danych. Po co tyle zapytań za każdym razem, gdy możemy skorzystać z interfejsu API Transients i po prostu buforować obiekt zapytania lub buforować całe wyjście HTML? W ten sposób ograniczymy i zoptymalizujemy liczbę zapytań do bazy danych, co doprowadzi do lepszej wydajności witryny i lepszego doświadczenia użytkownika.
W naszym przypadku zapytania będą przeszukiwać tabele wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts, aby uzyskać wszystkie oczekiwane wyniki.
Oto pełny przykład, jak możemy to osiągnąć:
function show_posts_from_category () { $ args = array ( 'cat' => 555, // Losowy identyfikator kategorii 'posts_per_page' => 8, // Losowa liczba powiązanych postów do wyświetlenia 'No_found_rows' => true, ); $ hash = md5 ($ args ['cat']); // Skrót MD5 identyfikatora kategorii $ transient_key = 'category-'. $ hash; // Klucz przejściowy if (false === ($ posts_from_category_html = get_transient ($ transient_key))): // Transient wygasł / nie został ustawiony $ the_query = new WP_Query ($ args); // Pobierz zapytanie ob_start (); // Włącz buforowanie danych wyjściowych while ($ the_query-> have_posts ()): $ the_query-> the_post (); ?> <div class = "item"> <div class = "bigthumb"> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php if (has_post_thumbnail ()) the_post_thumbnail ('duży kciuk' ); ?> </a> </div> <h3> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php the_title (); ?> </a> </h3> <? php the_excerpt (); ?> </div> <? php koniec; $ post_from_category_html = ob_get_contents (); // Pobiera zawartość bufora wyjściowego bez czyszczenia go ob_end_clean (); // Wyłącza buforowanie danych wyjściowych set_transient ($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); // Ustawienie przejściowego z 15-minutowym czasem wygaśnięcia wp_reset_postdata (); endif; return $ post_from_category_html; }
Końcowe przemyślenia
Buforowanie to świetny sposób na przyspieszenie, ale musisz dokładnie wiedzieć, co buforujesz, gdzie możesz to zrobić, kiedy i jak, w przeciwnym razie ryzykujesz nieoczekiwanymi konsekwencjami.
Jeśli nie masz pewności, czy coś działa zgodnie z przeznaczeniem, zawsze zwracaj się do profilowania - spójrz na każde zapytanie w bazie danych, spójrz na wszystkie wywołania funkcji PHP, czas i użycie pamięci.
Transients API to świetny sposób na zoptymalizowanie czasu ładowania witryny WordPress i zapewnienie wyjątkowego doświadczenia użytkownika. Używanie transjentów we wtyczkach i motywach jest proste i dodaje tylko kilka dodatkowych linii kodu. W odpowiednich sytuacjach - takich jak długie zapytania do bazy danych lub złożone przetworzone dane - może zaoszczędzić kilka sekund czasu ładowania witryny.