Szukam ostatecznej odpowiedzi tutaj. Kiedy buforowanie obiektów jest włączone, gdzie opcje i stany przejściowe kończą się?
Domyślnie oba są przechowywane w bazie danych. Ale słyszałem pewne odniesienia, że memcache przechowa je gdzie indziej, a APC zrobi coś zupełnie innego. Gdzie, dokładnie te dane zostaną utrwalone w obu przypadkach?
Odpowiedzi:
WordPress domyślnie ma formę „buforowania obiektów”, ale jego żywotność to tylko ładowanie jednej strony.
Opcje są naprawdę dobrym tego przykładem. Sprawdź tę odpowiedź, aby uzyskać więcej informacji. Podsumowanie:
SELECT option_name, option_value from $wpdb->options
instrukcjiget_option
nigdy nie trafienia do bazy danych, ponieważ są one przechowywane z API pamięci podręcznej WP).Opcje zawsze znajdują się „na żywo” w bazie danych i zawsze są tam przechowywane - to jest ich „kanoniczne” źródło. To powiedziawszy, opcje są ładowane do pamięci podręcznej obiektów, więc kiedy poprosisz o opcję, istnieje 99% szans, że żądanie nigdy nie trafi do bazy danych.
Stany przejściowe są nieco inne.
WordPress pozwala zastąpić interfejs pamięci podręcznej drop-in - plik, który jest umieszczany bezpośrednio w
wp-content
folderze. Jeśli utworzysz własną pamięć podręczną, upuść lub użyj istniejącej wtyczki , możesz sprawić, że pamięć podręczna obiektów będzie utrzymywać się dłużej niż ładowanie pojedynczej strony. Kiedy to zrobisz, stany przejściowe, trochę się zmień.Rzućmy okiem na
set_transient
funkcję wwp-includes/option.php
.Hmmm
$_wp_using_ext_object_cache
? Jeśli to prawda, WordPress zamiast tego używa pamięci podręcznej obiektów bazy danych do przechowywania stanów nieustalonych. Jak to się dzieje do prawdy? Czas zbadać, w jaki sposób WP konfiguruje własny interfejs API pamięci podręcznej.Możesz prześledzić prawie wszystko do
wp-load.php
lubwp-settings.php
- oba są kluczowe dla procesu ładowania WordPressa. W naszej pamięci podręcznej znajduje się kilka odpowiednich wierszywp-settings.php
.Pamiętasz ten spadek z góry? Rzućmy okiem na
wp_start_object_cache
wwp-includes/load.php
.Odpowiednie linie funkcji (odnoszące się do
$_wp_using_ext_object_cache
tego zmieniają sposób przechowywania stanów nieustalonych).jeśli
object-cache.php
istnieje w twoim katalogu zawartości, zostaje dołączony i WP zakłada, że używasz zewnętrznej, trwałej pamięci podręcznej - ustawia się$_wp_using_ext_object_cache
na true.Jeśli korzystasz z zewnętrznego obiektu pamięci podręcznej, będą go używać transjenty. Co rodzi pytanie o to, kiedy należy używać opcji vs. stanów nieustalonych.
Prosty. Jeśli potrzebujesz danych, aby trwały bez końca, skorzystaj z opcji. Dostają „buforowane”, ale ich kanonicznymi źródłami jest baza danych i nigdy nie odejdą, chyba że użytkownik wyraźnie o to poprosi.
W przypadku danych, które powinny być przechowywane przez określony czas, ale nie muszą trwać dłużej niż określone przejściowe okresy użytkowania. Wewnętrznie WP spróbuje użyć zewnętrznej, trwałej pamięci podręcznej obiektów, jeśli będzie to możliwe, w przeciwnym razie dane przejdą do tabeli opcji i zostaną usunięte śmieci za pomocą psuedo-cron WordPressa po ich wygaśnięciu.
Niektóre inne obawy / pytania:
get_option
? Prawdopodobnie. Powodują wywołanie funkcji narzutu funkcji, ale prawdopodobnie nie trafi ona do bazy danych. Ładowanie bazy danych jest często większym problemem w zakresie skalowalności aplikacji internetowych niż praca generowana przez wybrany język.add_option
z ostatnim, opcjonalnym argumentem, ponieważno
nie są one automatycznie ładowane. To powiedziawszy, gdy raz je ściągniesz, przejdą do pamięci podręcznej, a kolejne połączenia nie trafią do bazy danych.źródło
Istnieją 4 typy pamięci podręcznej, o których wiem
Trywialny - jest zawsze włączony i działa, zanim w grę wejdzie inne buforowanie. Przechowuje buforowane elementy w tablicy php, co oznacza, że zużywa pamięć z sesji wykonawczej php i że pamięć podręczna jest opróżniana po zakończeniu wykonywania php. tzn. nawet bez użycia innej pamięci podręcznej, jeśli wywołasz get_option ('opt') dwa razy z rzędu, wykonasz zapytanie DB tylko za pierwszym razem, a za drugim razem wartość zostanie zwrócona z pamięci.
Plik - buforowane wartości są przechowywane w plikach gdzieś w katalogu głównym. Uważam, że okazało się to nieskuteczne pod względem wydajności, chyba że masz bardzo szybki dysk lub pamięć plików zmapowanych w pamięci.
APC (lub inne buforowanie oparte na akceleratorze php) - Wartości buforowane są przechowywane w pamięci komputera hosta i poza alokacją pamięci php. Największą potencjalną pułapką jest to, że nie ma zasięgu danych, a jeśli prowadzisz dwie witryny, potencjalnie każda z nich może uzyskać dostęp do danych w pamięci podręcznej drugiej lub je zastąpić.
Pamięć podręczna - jest to pamięć podręczna oparta na sieci. Możesz uruchomić usługę buforowania w dowolnym miejscu w sieci i prawdopodobnie przechowuje ona wartości w pamięci hosta. Prawdopodobnie nie potrzebujesz memcache, chyba że masz równoważenie obciążenia w akcji.
BTW, buforowanie obiektów jest buforowaniem znacznie więcej niż opcji, będzie przechowywać prawie wszystko, co zostało pobrane z bazy danych przy użyciu WP API na wysokim poziomie.
źródło
Opcje są zawsze przechowywane w bazie danych, a transjenty mogą być przechowywane tylko we wspólnej pamięci, jeśli zainstalowano APC i wtyczkę, która implementuje buforowanie APC w WP. Memcache również wykorzystuje pamięć.
Opcje są również przechowywane w pamięci i ładowane stamtąd, jeśli to możliwe (jeśli nie, wykonywane jest zapytanie db).
źródło
Świetne pytanie.
Myślę, że
WP_Object_Cache
wciąż brakuje części tego, w jaki sposób WordPress używa klasy, więc dodam to.Z dokumentów:
Oto
WP_Object_Cache
struktura.stats()
Metoda ta służy do wyświetlania ogólnych statystyk dotyczących globalnego obiektu pamięci podręcznej i tego, co tam jest. Oto wynik:To właśnie otrzymałem na samym początku szablonu, takiego jak
single.php
.Uwaga zmienna jesteśmy zainteresowani jest:
global $wp_object_cache
.Prywatne członek
$cache
przechowuje rzeczywiste dane buforowania.Odkąd byłem,
single.php
kiedy wydrukowałem pamięć podręczną:Dostaję buforowany pojedynczy post.
Obiekt byłby wartością, a kluczem buforującym byłby
Tutaj możesz sprawdzić
$cache_key
strukturę:źródło