Oprócz instalacji W3 Total Cache lub innej wtyczki buforującej, jakie kroki mogę podjąć, aby upewnić się, że mój motyw i strona działają tak szybko, jak to możliwe.
Oprócz instalacji W3 Total Cache lub innej wtyczki buforującej, jakie kroki mogę podjąć, aby upewnić się, że mój motyw i strona działają tak szybko, jak to możliwe.
Odpowiedzi:
Możesz zainstalować WordPress na Nginx. Istnieje wiele zasobów, które mogą pomóc:
Niektóre informacje o wydajności z tego ostatniego linku (który wygląda na nieco inną konfigurację niż inne):
Postanowiłem więc umieścić proxy przed wordpress w statycznej pamięci podręcznej tak bardzo, jak to możliwe. Cały nieuwierzytelniony ruch jest obsługiwany bezpośrednio z pamięci podręcznej pliku nginx, przyjmując niektóre żądania (takie jak generowanie kanału RSS) od 6 stron / sekundę do ponad 7000 stron / sekundę. Nie. Nginx obsługuje także rejestrowanie i gzipping, pozostawiając cięższe backendowe podejścia do robienia tego, co robią najlepiej: obsługuj dynamiczne strony Wordpress tylko wtedy, gdy jest to potrzebne.
...
Na Nginx - jest tak wydajny, że przerażający. Nigdy nie widziałem, aby używał więcej niż 10 do 15 megabajtów pamięci RAM i mocy procesora, nawet przy naszym największym obciążeniu. Nasze wykresy zwojów nie kłamią: zmniejszyliśmy o połowę nasze wymagania dotyczące pamięci, podwoiliśmy przepustowość sieci wychodzącej i całkowicie wyrównaliśmy obciążenie. Odkąd to skonfigurowaliśmy, nie mieliśmy praktycznie żadnych problemów.
Ustaw wygaśnięcia po stronie klienta dla rzeczy takich jak css, obrazy, JavaScript itp., Które nie muszą być ponownie pobierane dla każdego wyświetlenia strony. To zdecydowanie miało największy wpływ na czas ładowania mojej witryny. Najszybsze pobieranie to pobieranie, które nigdy się nie wydarzyło ...
# BEGIN Expire headers
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 7200 seconds"
ExpiresByType image/x-icon "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
ExpiresByType text/css "access plus 2592000 seconds"
ExpiresByType text/javascript "access plus 2592000 seconds"
ExpiresByType application/x-javascript "access plus 2592000 seconds"
ExpiresByType text/html "access plus 7200 seconds"
ExpiresByType application/xhtml+xml "access plus 7200 seconds"
</IfModule>
# END Expire headers
# BEGIN Cache-Control Headers
<IfModule mod_headers.c>
<FilesMatch "\\.(ico|jpe?g|png|gif|swf|gz)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\\.(css)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\\.(js)$">
Header set Cache-Control "max-age=2592000, private"
</FilesMatch>
<filesMatch "\\.(html|htm)$">
Header set Cache-Control "max-age=7200, public"
</filesMatch>
# Disable caching for scripts and other dynamic files
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
# END Cache-Control Headers
Możesz wstępnie zgzipować wszystko, co rozsądnie możesz zrobić (7-zip jest dobrym narzędziem do tego) i przesłać go w to samo miejsce, co właśnie spakowany plik. Zmień plik .htaccess, aby wyświetlać wstępnie spakowane pliki, jak poniżej. Zastrzeżeniem jest to, że musisz pamiętać o ponownym zgzipowaniu ich, jeśli / podczas aktualizacji rzeczy. To odcina obciążenie procesora, poza analizowaniem .htaccess.
RewriteEngine on
#Check to see if browser can accept gzip files. If so and we have it - serve it!
ReWriteCond %{HTTP:accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
#make sure there's no trailing .gz on the url
ReWriteCond %{REQUEST_FILENAME} !^.+\.gz$
#check to see if a .gz version of the file exists.
RewriteCond %{REQUEST_FILENAME}.gz -f
#All conditions met so add .gz to URL filename (invisibly)
RewriteRule ^(.+) $1.gz [QSA,L]
To tylko surowa odpowiedź. Istnieje wiele odmian tego tematu. Napisałem o tym na blogu i dodałem sporo odniesień do bardziej szczegółowych artykułów na http://icanhazdot.net/2010/03/23/some-wordpress-stuff/ . Przeczytaj to i, co ważniejsze, odniesienia, na które wskazuję - są to dobre zasoby.
Pamiętaj, że jeśli często majstrujesz, użytkownicy będą musieli odświeżyć pamięć podręczną.
Bardzo przydatna wtyczka to wp-minify . W tym przypadku należy wykluczyć elementy specyficzne dla strony (formularz kontaktowy, suwak strony głównej itp.), Aby nie pobierać ponownie całego zestawu css, JS itp. Dla każdej strony. Jest to dobry sposób na zminimalizowanie, połączenie i skompresowanie twojego podstawowego CSS, JS itp. To znacznie ogranicza żądania HTTP. Wp-minify działa dobrze z supercache, a także z nagłówkami wygaśnięcia, które opisałem powyżej.
Użyj Yslow w Firebug (Firefox) lub podobnym do monitorowania żądań HTTP oraz tego, co jest i nie jest skompresowane. Spójrz również na nagłówki wygaśnięcia. Wkrótce zobaczysz, co możesz poprawić.
Zminimalizuj liczbę uruchomionych wtyczek, aby uzyskać tylko to, czego naprawdę potrzebujesz. Zwłaszcza pamiętaj o wtyczkach, które dodają kod javascript i kod CSS przy każdym ładowaniu strony, nawet jeśli ten kod nie jest używany na stronie.
Jeśli tworzysz własny motyw od zera, zniszcz CSS, aby funkcje potrzebne tylko dla określonych szablonów stron lub typów widoków (pojedynczy post, archiwa, kategoria itp.) Były ładowane tylko w razie potrzeby.
Skonfiguruj W3TC do korzystania z CDN (jak Amazon CloudFront lub dowolny inny obsługiwany przez W3TC).
Sprawdź, czy opcje Minify działają dla Ciebie (niektóre wtyczki generują plik js / css, który nie ładnie zminimalizuje, więc pamiętaj o przetestowaniu witryny po aktywacji funkcji minify).
Jeśli masz pełną kontrolę nad swoim serwerem MySQL, upewnij się, że masz włączone query_cache. Użyj skryptu strojenia MySQL, aby znaleźć inne sposoby optymalizacji konfiguracji bazy danych.
Jeśli korzystanie z CDN jest z jakiegoś powodu problematyczne, skonfiguruj mod_expires w konfiguracji apache. Ustaw czasy ważności tak długo, jak jest to uzasadnione dla typów statycznych, takich jak obrazy, css, javascript, wideo, audio itp.
Uruchom memcached i użyj pamięci podręcznej obiektów, aby zmniejszyć liczbę zapytań do bazy danych. To buforuje dane z bazy danych, a nie stron. Nie jestem pewien, czy w3-total-cache już to robi.
Upewnij się, że korzystasz z pamięci podręcznej kodów operacyjnych, takiej jak APC . (Istnieje kilka innych dostępnych.)
Oprócz korzystania z wtyczki buforowania dysku, takiej jak wp-cache, umieść swojego bloga na woluminie hosta z ustawioną na nim właściwością „noatime”. W przeciwnym razie, SSH do twojego hosta (jeśli twój webhost to zapewnia) i rutynowo uruchamiaj to polecenie na swoich plikach co kilka dni:
chattr -R +A ~/*
~ / * Oznacza „moje pliki w moim katalogu domowym”. Możesz zmienić tę ścieżkę według własnego uznania. Możesz również ustawić to dla zadania cron w cpanel, jeśli twój webhost to zapewnia.
Aby uzyskać więcej informacji o nieruchomości atime, zobacz to . Znacznie przyspiesza to odczyt dysku Linux.
Czasami twoja strona jest wbijana przez pająki. Możesz użyć narzędzia takiego jak SpyderSpanker lub Chennai Central, aby odfiltrować pająki, które nie pomagają zwiększyć pozycji strony w Twojej witrynie i jedynie spowalnia ją, a następnie zdławić dobre pająki (takie jak Google, Bing itp.), Wysyłając je losowo Wiadomości HTTP 304 niezmodyfikowane.
Kolejną rzeczą, którą widzę, są po prostu źle napisane wtyczki. Jeśli nauczysz się, jak tworzyć wtyczki, zaczynasz widzieć, jak niektóre wtyczki są nieefektywnie kodowane, a nawet znaleźć szkielety czasowe, takie jak tabela bazy danych, która wypełnia się i wypełnia i nigdy nie jest czyszczona, przechowując takie rzeczy, jak dane połączenia przychodzącego.
Oprócz wszystkich innych rozwiązań tutaj, możesz także stworzyć farmę internetową WordPress swojego bloga, hostując ją na kilku komputerach z węzłem sieci, które wszystkie łączą się z powrotem z jedną bazą danych i jednym woluminem dyskowym dla plików (np. Wolumin zamontowany nad NFS ). Sprawdź Ultra Monkey, aby dowiedzieć się, jak to zrobić.
Kilka odpowiedzi z góry mojej głowy:
1) Zminimalizuj liczbę żądań HTTP, które przeglądarka musi przesyłać do twojego hosta, łącząc JavaScript i CSS tam, gdzie to możliwe / praktyczne.
2) Odciąż jak najwięcej zdjęć / multimediów do CDN stron trzecich, jak to możliwe, szczególnie jeśli korzystasz z hostingu współdzielonego.
3) Spróbuj zmniejszyć liczbę postów wyświetlanych na pierwszej stronie, aby skrócić całkowity czas renderowania.
3a) Spróbuj użyć motywu, który w całości prezentuje kilka polecanych postów na pierwszej stronie i wszystkie inne, starsze posty jako fragmenty.
Pamięć podręczna menu WordPress zapewnia również zwiększenie wydajności. Zwłaszcza jeśli masz dużo stron lub gigantyczną strukturę menu, należy to wziąć pod uwagę.
Zrób to w 2 łatwych krokach. Najpierw utwórz funkcję, która pobiera lub tworzy menu, zamiast wywoływać wp_nav_menu
bezpośrednio.
function get_cached_menu( $menuargs ) {
if ( !isset( $menuargs['menu'] ) ) {
$theme_locations = get_nav_menu_locations();
$nav_menu_selected_id = $theme_locations[$menuargs['theme_location']];
$termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );
$transient = 'menu_' . $termslug->slug . '_transient';
} else {
$transient = 'menu_' . $menuargs['menu'] . '_transient';
}
if ( !get_transient( $transient ) ) { // check if the menu is already cached
$menuargs['echo'] = '0'; // set the output to return
$this_menu = wp_nav_menu( $menuargs ); // build the menu with the given $menuargs
echo $this_menu; // output the menu for this run
set_transient( $transient, $this_menu ); // set the transient, where the build HTML is saved
} else {
echo get_transient( $transient ); // just output the cached version
}
}
W swoim motywie zamień wp_nav_menu
s na get_cached_menu
. Teraz, za każdym razem, gdy menu jest wywoływane, masz jedno zapytanie do bazy danych zamiast całego menubuildingu.
Menu nie zmieniają się często - ale musisz również dołączyć do wp_update_nav_menu
akcji, aby usunąć stare transjenty.
Zrób to tak:
add_action('wp_update_nav_menu', 'my_delete_menu_transients');
function my_delete_menu_transients($nav_menu_selected_id) {
$termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );
$transient = 'menu_' . $termslug->slug . '_transient';
delete_transient( $transient );
}
Menu zostanie wygenerowane przy następnym wywołaniu strony - i używaj wersji z pamięci podręcznej, dopóki ktoś nie zaktualizuje menu ponownie.
Zaktualizowana wersja
Dzięki @helgatheviking za wskazanie błędu między ślimakami a identyfikatorami. Zaktualizowałem funkcje, dzięki czemu działa zarówno z, jak theme_position
i menu
(dla bezpośredniego wywołania menu).
Menu są zawsze zapisywane z nazwą menu, a nie z pozycją w motywie.
$nav_menu_selected_id
jest liczbą, podczas gdy wywołanie get_cached_menu()
THE menu_id
jest zmienną ciąg, ponieważ parametr staje identyfikator CSS dla <ul>
elementu.
Użyj klasy bazy danych przyciętej do optymalizacji. Zrobiliśmy dobre doświadczenia z własnym kodem, aby zmniejszyć zużycie pamięci i szybkość dostępu do bazy danych. Oprócz tego możesz zoptymalizować samą strukturę bazy danych za pomocą drobnych zmian, które również dużo robią.
Część kodu klasy bazy danych można znaleźć w wordpress trac, nie uczyniono go rdzeniem ( Ticket # 11799 i powiązane ).
W przypadku witryny o dużym natężeniu ruchu należy dostroić wszystkie bufory MySQL pod kątem zawartości, która jest już dostępna. Niezależnie od wersji WordPress warstwa MySQL może zostać obliczona .
W rzeczywistości, jeśli masz dane InnoDB bez włączania innodb_file_per_table, musisz oczyścić InnoDB poprzez segmentację każdej tabeli we własnym fizycznym obszarze tabel . Można dokonać przyzwoitego strojenia MySQL, nawet jeśli masz ograniczony sprzęt . Istnieje wiele scenariuszy przeprowadzania takich optymalizacji InnoDB .
IMHO, nie możesz zaplanować dobrych ustawień dla my.cnf bez znajomości ilości danych do skonfigurowania. Będziesz musiał okresowo ładować bieżący zestaw danych z produkcji do środowiska pomostowego, przeprowadzać optymalizacje i podawać liczby do skonfigurowania w pliku my.cnf serwera produkcyjnego.
możesz włączyć globalną kompresję danych wyjściowych . Spowoduje to zgzipowanie wszystkiego, co wychodzi automatycznie, jeśli przeglądarka to obsługuje. To drastycznie zmniejsza rozmiar przesyłanych plików, ale zwiększa obciążenie procesora.
Niedawno rozmawiałem na ten temat w WordCamp Houston . Wszystkie powyższe zalecenia są świetne, a ważne jest, aby upewnić się, że wszystkie elementy interfejsu są w pełni zoptymalizowane, aby można było rozpocząć pracę nad buforowaniem i problemami z wydajnością serwera.
Stopniowe renderowanie sprawi, że strony będą się czuć szybciej, ponieważ użytkownik zobaczy zawartość strony przed jej pełnym załadowaniem. Aby to zrobić, upewnij się, że blokujący plik js znajduje się na samym dole strony, a css na górze.
Również jeśli używasz wielu przycisków mediów społecznościowych, możesz dostosować skrypty, aby ładowały się w ramce iframe po pełnym załadowaniu strony. Napisałem samouczek, jak to zrobić za pomocą przycisku TweetMeMe re tweet (teraz przestarzały, ponieważ Twitter opublikował własny przycisk retweetowania), ale nadal można go zastosować do innych przycisków udostępniania.
Aby sprawdzić wydajność serwera, spójrz na Nginx jako front-end proxy dla zawartości statycznej z Apache obsługującym ciężkie podnoszenie PHP i MySQL.
Ponieważ nikt jeszcze o tym nie wspominał, jednym z najważniejszych kroków w celu zwiększenia wydajności serwera w połączeniu z dowolną konfiguracją LAMP byłoby przejście na wątek roboczy apache i mod_fcgid.
To uwolniło 500 MB pamięci na moim wirtualnym prywatnym serwerze.
Jest pięknie prosta wtyczka o nazwie Page Load Time , która dodaje stoper do stopki strony. To właściwie tylko cztery linie kodu:
<?php
function ur_pageload_footer() {
printf(__('Page in %s seconds', 'pageload'), timer_stop());
}
add_action('wp_footer', 'ur_pageload_footer')
Następnie:
Twój arkusz kalkulacyjny powinien wyglądać mniej więcej tak
+-------+-------+-------+-------+--------+
| Run 1 | Run 2 | Run 3 | Order | Plugin |
Jeśli więc po dezaktywacji wtyczki czas odpowiedzi strony znacznie się wydłuży, możesz sprawdzić, czy możesz jej uniknąć.
Znalazłem dwie wtyczki, które spowodowały „znaczne” spowolnienie mqtranslate i (raczej starą, ale dobrą) wielopoziomową wtyczkę nawigacyjną .
Trzymaj się wtyczki W3 Total Cache dla funkcji buforowania w WordPress. Włącz buforowanie stron i buforowanie bazy danych na stronie ustawień wtyczki. Upewnij się, że wybrałeś „Alternative PHP Cache (APC / APCu)” jako mechanizm buforowania. NIE włączaj żadnych minimalizacji w W3 Total Cache, ponieważ istnieje wiele szans na uszkodzenie wyglądu i / lub funkcjonalności witryny. Pozostawimy to Cloudflare.
Po zakończeniu konfiguracji pozostałych funkcji wtyczki skonfiguruj Cloudflare dla swojej witryny. Upewnij się, że włączasz Cloudflare w ustawieniach Total Cache W3 również w „Rozszerzeniach”.
Cloudflare to sieć dostarczania treści, która buforuje całą zawartość statyczną (pliki obrazów, CSS, JS, dokumenty itp.) Z Twojej witryny i udostępnia ją użytkownikom z ich globalnych serwerów. Może to pomóc przyspieszyć czas ładowania strony i zmniejszyć obciążenie serwera. Aby uzyskać listę typów plików, które są buforowane przez Cloudlfare, sprawdź tę listę . Co więcej, Cloudflare ma bezpłatny plan.
W Cloudflare ustaw poziom buforowania na standardowy i ustaw wygasanie pamięci podręcznej przeglądarki na co najmniej dłuższą niż 20 godzin. Włącz Always Online ™, aby nawet w przypadku awarii serwera Cloudflare obsługiwał statyczne strony witryny z pamięci podręcznej. Włącz także ich funkcję automatycznego minimalizowania (pamiętasz, dlaczego prosiłem cię, abyś nie włączał minimalizacji jest W3 Total Cache? Ponieważ Cloudflare robi to lepiej!) Następnie ustaw Rocket Loader ™ na automatyczny.
Oto fragment tego, co robi Rocket Loader:
Zmniejszając liczbę żądań sieciowych, łącząc pliki JavaScript, nawet zasoby stron trzecich, aby uniknąć spowolnienia renderowania strony.
Asynchroniczne ładowanie skryptów, w tym skryptów stron trzecich, aby
nie blokowały
natychmiastowego ładowania zawartości strony .
Lokalne buforowanie skryptów (przy użyciu LocalStorage, dostępnego w większości
przeglądarek i smartfonów), aby nie były ponownie pobierane, chyba że jest to
konieczne.
Więcej informacji można znaleźć tutaj .
Jeśli to możliwe, przejdź do frameworka Genesis dla WordPress, ponieważ są one czyste, bez żadnych wzdęć. Genesis został zbudowany z myślą o szybkości i SEO. Ja sam to przetestowałem i moje wyniki PageSpeed były dobre. Również jeśli korzystasz z Genesis, nie zapomnij włączyć pamięci podręcznej fragmentów w ustawieniach Total Cache W3.
Ponieważ teraz używasz Cloudlfare jako CDN, możesz użyć wtyczki, takiej jak „ Imagify ” lub „ Kompresuj obrazy JPEG i PNG ” TingPNG, aby skompresować swoje zdjęcia. Obie są darmowymi wtyczkami dostępnymi w repozytorium wtyczek WordPress.org. Imagify obsługuje również potężny algorytm kompresji stratnej.
Na koniec zainstaluj wtyczkę „ Usuń ciągi zapytania z zasobów statycznych ” z repozytorium WordPress, aby usunąć ciągi zapytania z zasobów statycznych, takich jak pliki CSS i JS. Wynika to z faktu, że zasoby z „?” Lub „&” w adresie URL nie są buforowane przez niektóre serwery buforujące proxy (pamiętaj, że Cloudflare jest również serwerem buforującym proxy).
Następnie zainstaluj wtyczkę „ Użyj bibliotek Google ”. Ta wtyczka umożliwia witrynie WordPress korzystanie z CDN biblioteki API AJAX API Google zamiast bezpośredniego udostępniania tych plików z instalacji WordPress.
Niektóre korzyści to:
Last but not least, użyj wtyczki „ WP-Optimize ” firmy Ruhani Rabin, aby wyczyścić i zoptymalizować bazę danych.
Mam nadzieję, że to odpowiada na twoje pytanie dotyczące optymalizacji WordPressa w celu zmniejszenia obciążenia serwera.