Kommandoradstips för förbättrad prestanda

Publicerad: 12.5.2020 Uppdaterad: 11.5.2020

Det finns många artiklar på nätet om hur man kan optimera hastigheten i WordPress, men de flesta rekommenderar bara att man ska installera olika tillägg. Men att installera fler tillägg kan tyvärr försämra saker och ting, eftersom tilläggen i sig själva gör WordPress långsammare. Tilläggen kan också kräva att man lär sig en hel del om olika alternativ och inställningar. Dessutom behöver tilläggen underhållas och hållas uppdaterade.

Lyckligtvis kan man göra mycket redan från kommandoraden (t.ex. via en SSH-förbindelse). Det finns många fördelar med att arbeta via SSH: kommandona går snabbt att köra, resultatet av varje kommando finns kvar på skärmen så att man kan granska resultatet. Dessutom är kommandona lätta att kopiera och klistra in och de kan läggas in i skript, något som spara tid för dem som arbetar med många webbplatser.

Mät. Ändra något. Kontrollera.

Innan man börjar göra några prestandaoptimeringar är det viktigt att göra mätningar för att ha koll på utgångsläget. Efter att man gjort ändringar på webbplatsen behöver man mäta en gång till för att kontrollera om ändringarna faktiskt gav någon förbättring. Du riskerar att saker blir sämre om du bara blint följer någons anvisningar, eftersom en del förändringar gör vissa webbplatser snabbare, medan andra tvärtom blir långsammare. För att faktiskt uppnå några användbara resultat är det därför helt grundläggande att man vet hur man mäter utgångsvärdena och att man kommer ihåg att efteråt bekräfta förbättringen med en ny mätning.

Vårt favoritverktyg för detta ändamål bland kommandoradskommandona är cURL. Du kan exempelvis med cURL initiera en HTTP-förfrågan, visa header-fälten i svaret från servern och skriva ut hur lång tid det hela tog med följande kommando:

$ curl -I -w "%{time_total}\n" https://seravo.com/
HTTP/2 200 
server: nginx
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
referrer-policy: strict-origin-when-cross-origin
x-xss-protection: 1; mode=block
x-powered-by: Seravo

0.081511

Observera att tecknet $ inte ingår i själva kommandot utan helt enkelt är systemprompten för kommandoraden. Argumentet -I till curl instruerar programmet att visa header-fälten i HTTP-svaret, där vi bland annat ser att servern svarade med statuskoden HTTP/2 200, vilket innebär att allt gick bra. Argumentet -w ber curl att skriva ut den totala tiden som förflöt mellan begäran och svar, vilket visar oss hur snabb servern är och hur stor fördröjningen är mellan maskinen där kommandot kördes och webbservern. I det här exemplet hämtades svaret på 81 millisekunder.

Ibland kan mätresultatet variera. Därför är det bra att göra flera mätningar. Dessutom, om servern använder cache-hantering på HTTP-nivån (t.ex. med hjälp av en frontande proxy-server) kan man skicka med HTTP-headern Pragma: no-cache i förfrågan för att informera servern att cache-servrar ska förbigås och att man önskar svar ända inifrån PHP-processen som kör WordPress. Det är precis samma header-fält en webbläsare skickar till servern när man trycker på Ctrl+F5 eller Cmd+Shift+R för att ladda om en sida.

Om man kombinerar dessa funktioner i ett bash-script som kör 5 repetitioner kan det se ut så här:

$ for i in {1..5}; do LC_NUMERIC=C curl -IL -w "%{time_total}\n" -H Pragma:no-cache -o /dev/null -s "https://seravo.com"; done
0.247952
0.300009
0.265494
0.257871
0.258129

Med 5 mätningar efter varandra kan man se hur stor eller liten variation man får mellan mätresultaten. Extrakommandot LC_NUMERIC=C ser till att den förflutna tiden skrivs ut med decimalpunkt i stället för komma som decimaltecken. Parametern -L instruerar curl att följa eventuella omdirigeringar, medan parametrarna -s och -o /dev/null används för att undertrycka all annan utmatning så att enbart den totala laddningstiden skrivs ut i en smidig lista.

Kommandot curl kan vem som helst köra var som helst. Seravos kunder har dessutom tillgång till specialkommandot wp-speed-test som i princip är en stiligare version av curl-loopen här ovan. Det kommandot accepterar även argumentet --cache om man vill mäta just hur snabbt en sida laddas från cache-minnet, eftersom kommandots standardfunktion är att mäta WordPress hastighet utan användning av cache. Om man vill kan en specifik URL ges som argument. Om argumentet inte är angivet kommer kommandot helt enkelt att köra testen mot startsidan för WordPress-webbplatsen.

Exempel på utmatningen från kommandot:

$ wp-speed-test https://seravo.com/features/
Testing speed URL https://seravo.com/features/...

For an explanation of the different times, please see docs at https://curl.haxx.se/docs/manpage.html

URL                             TOTAL NAMELOOKUP CONNECT APPCONNECT PRETRANSFER STARTTRANSFER    = AVG
https://seravo.com/features/    0.111      0.004   0.005      0.013       0.013         0.111    0.111
https://seravo.com/features/    0.078      0.000   0.000      0.000       0.000         0.078    0.095
https://seravo.com/features/    0.101      0.000   0.000      0.000       0.000         0.101    0.097
https://seravo.com/features/    0.079      0.000   0.000      0.000       0.000         0.079    0.092
https://seravo.com/features/    0.084      0.000   0.000      0.000       0.000         0.084    0.091
https://seravo.com/features/    0.121      0.000   0.000      0.000       0.000         0.121    0.096
https://seravo.com/features/    0.113      0.000   0.000      0.000       0.000         0.113    0.098
https://seravo.com/features/    0.076      0.000   0.000      0.000       0.000         0.076    0.095
https://seravo.com/features/    0.084      0.000   0.000      0.000       0.000         0.084    0.094
https://seravo.com/features/    0.158      0.000   0.000      0.000       0.000         0.158    0.101
https://seravo.com/features/    0.083      0.000   0.000      0.000       0.000         0.083    0.099
https://seravo.com/features/    0.112      0.000   0.000      0.000       0.000         0.112    0.100
https://seravo.com/features/    0.076      0.000   0.000      0.000       0.000         0.075    0.098
https://seravo.com/features/    0.095      0.000   0.000      0.000       0.000         0.095    0.098
https://seravo.com/features/    0.072      0.000   0.000      0.000       0.000         0.072    0.096
https://seravo.com/features/    0.120      0.000   0.000      0.000       0.000         0.119    0.098
https://seravo.com/features/    0.091      0.000   0.000      0.000       0.000         0.091    0.097
https://seravo.com/features/    0.105      0.000   0.000      0.000       0.000         0.105    0.098
https://seravo.com/features/    0.131      0.000   0.000      0.000       0.000         0.131    0.100
https://seravo.com/features/    0.135      0.000   0.000      0.000       0.000         0.135    0.101


Test completed. If the values seems too high, please profile your PHP code to find potential bottle necks.
Note that this test tells how fast your site is in the sense of how long it takes for PHP to generate the HTML output. To test how much load the site can handle, run wp-load-test.

(Testet är avslutat. Om värdena verkar vara höga bör du granska din PHP-kod och försöka hitta eventuella flaskhalsar.
Observera att detta test visar hur snabb din webbplats är i betydelsen hur lång tid det tar för PHP-koden att generera den resulterande HTML-koden. För att testa hur hög belastning webbplatsen klarar av kör du programmet wp-load.test.
)

Ta snabbt reda på vilket tillägg som gör din webbplats långsam

Utöver cURL finns det ett annat verktyg som vi använder hela tiden, nämligen WP-CLI, som låter dig styra WordPress-installationen direkt från kommandoraden. Till exempel skulle du kunna installera och aktivera tillägget Native Lazyload plugin by Google på en och samma gång genom att köra kommandot wp plugin install --activate native-lazyload. Detta är extremt smidigt, så vi rekommenderar verkligen att du använder det. Du tar fram hjälpen för kommandoraden med kommandot wp --help. Observera att till skillnad från cURL, som kan köras varsomhelst för att prova valfri webbplats (kommandot använder externa HTTP-förfrågningar), så måste kommandot wp köras på just den server där WordPress är installerat, eftersom programmet behöver ha direkt åtkomst till webbplatsens filer och databas.

Genom att kombinera cURL och WP-CLI kan du på ett snyggt sätt inaktivera ett tillägg i taget och mäta hur stor effekt detta ger på laddningstiden för WordPress som helhet. Nedanstående miniprocedur gör fem mätningar, inaktiverar ett tillägg, gör en ny uppsättning mätningar och aktiverar sedan tillägget igen. Dessa steg upprepas för alla tillägg. Om något tillägg är mycket långsamt bör du märka stora skillnader i laddningstiderna.

for p in $(wp plugin list --fields=name --status=active)
do
  echo $p
  wp plugin deactivate $p
  for i in {1..5}
  do
    curl -o /dev/null -w "%{time_total}\n" \
    -H "Pragma: no-cache" -s http://localhost/
  done
  wp plugin activate $p 
done

Här är en skärmdump som visar hur det kan se ut för ett tillägg som är mycket långsamt, där tiden för att ladda sidan blir mycket kortare när just det tillägget är inaktiverat.

Exempel på utmatning från en for-slinga som kombinerar wp-cli och cURL för att ta reda på vilket tillägg som gör WordPress-webbplatsen långsam.

Användning av profileringspaketet i WP-CLI

Utöver de kommandon som ingår från början i WP-CLI kan verktyget byggas ut med hjälp av så kallade paket. Ett exempel på detta är paketet profile-command. Det erbjuder ett snabbt sätt att analysera vilket steg i programkörningen eller vilken ”hook” som tar alltför lång tid att köra på webbplatsen. Denna analys i sig själv klarar inte att peka ut vilket tillägg eller vilken kod i temat som är skyldig, men kan vara mycket värdefull för en utvecklare som sedan kan studera koden mer ingående när han eller hon har väl vet i vilket körningssteg eller i vilken ”hook” man ska leta. För att kunna använda paketet behöver man först installera det med kommandot wp package install wp-cli/profile-command.

Här är några exempel på profileringskommandon och utskrifter från dem.

$ wp profile stage --all --spotlight
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| hook                     | callback_count | time    | query_time | query_count | cache_ratio | cache_hits | cache_misses | request_time | request_count |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| muplugins_loaded:before  |                | 0.2045s | 0s         | 0           | 91.67%      | 11         | 1            | 0s           | 0             |
| plugins_loaded:before    |                | 0.858s  | 0.0015s    | 2           | 100%        | 231        | 0            | 0s           | 0             |
| plugins_loaded           | 62             | 0.3323s | 0s         | 0           | 100%        | 192        | 0            | 0s           | 0             |
| after_setup_theme:before |                | 0.0769s | 0s         | 0           | 100%        | 438        | 0            | 0s           | 0             |
| after_setup_theme        | 19             | 0.0857s | 0s         | 0           | 96.72%      | 59         | 2            | 0s           | 0             |
| init                     | 183            | 0.4485s | 0.0007s    | 1           | 99.52%      | 1453       | 7            | 0s           | 0             |
| wp_loaded                | 31             | 0.0772s | 0.0249s    | 6           | 99.17%      | 240        | 2            | 0s           | 0             |
| parse_request:before     |                | 0.6226s | 0s         | 0           | 100%        | 2392       | 0            | 0s           | 0             |
| template_redirect        | 39             | 0.0142s | 0s         | 0           | 98.61%      | 142        | 2            | 0s           | 0             |
| wp_head                  | 41             | 0.108s  | 0.0009s    | 1           | 99.26%      | 945        | 7            | 0s           | 0             |
| loop_start:before        |                | 1.3029s | 0.0312s    | 44          | 95%         | 15292      | 804          | 0s           | 0             |
| loop_end:before          |                | 0.1547s | 0s         | 0           | 96.68%      | 1396       | 48           | 0s           | 0             |
| wp_footer:before         |                | 0.2821s | 0.0062s    | 4           | 97.33%      | 5176       | 142          | 0s           | 0             |
| wp_footer                | 26             | 0.0074s | 0.0008s    | 1           | 100%        | 83         | 0            | 0s           | 0             |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| total (14)               | 401            | 4.5751s | 0.0661s    | 59          | 98.14%      | 28050      | 1015         | 0s           | 0             |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+

$ wp profile hook --all --spotlight
+-------------------------------------------------+-------------------------------------------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| callback                                        | location                                        | time    | query_time | query_count | cache_ratio | cache_hits | cache_misses | request_time | request_count |
+-------------------------------------------------+-------------------------------------------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| SimpleHistory->filter_gettext()                 | simple-history/inc/SimpleHistory.php:796        | 0.011s  | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| GFForms::loaded()                               | gravityforms/gravityforms.php:239               | 0.01s   | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| wpseo_init()                                    | wordpress-seo/wp-seo-main.php:293               | 0.0159s | 0s         | 0           | 100%        | 54         | 0            | 0s           | 0             |
| SkyVerge\WooCommerce\COG\Utilities\Previous_Ord | woocommerce-cost-of-goods/vendor/skyverge/wc-pl | 0.011s  | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| SimpleHistory->load_loggers()                   | simple-history/inc/SimpleHistory.php:979        | 0.0162s | 0s         | 0           | 100%        | 4          | 0            | 0s           | 0             |
| WooCommerce->init()                             | woocommerce/includes/class-woocommerce.php:533  | 0.1144s | 0s         | 0           | 100%        | 657        | 0            | 0s           | 0             |
| wp_widgets_init()                               | wp-includes/widgets.php:1601                    | 0.03s   | 0s         | 0           | 100%        | 180        | 0            | 0s           | 0             |
| ACF->init()                                     | advanced-custom-fields-pro/acf.php:218          | 0.0396s | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| WC_Post_Types::register_taxonomies()            | woocommerce/includes/class-wc-post-types.php:36 | 0.0196s | 0s         | 0           | 100%        | 61         | 0            | 0s           | 0             |
| wpDiscuzForm->initPersonalDataExporter()        | wpdiscuz/forms/wpDiscuzForm.php:63              | 0.0037s | 0.0006s    | 1           | 100%        | 10         | 0            | 0s           | 0             |
| WP_Rewrite->flush_rules()                       | wp-includes/class-wp-rewrite.php:1744           | 0.0835s | 0.042s     | 4           | 99.54%      | 217        | 1            | 0s           | 0             |
| WC_API->rest_api_includes()                     | woocommerce/includes/class-wc-api.php:126       | 0.0493s | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| WC_API->register_rest_routes()                  | woocommerce/includes/class-wc-api.php:251       | 0.2017s | 0s         | 0           | 100%        | 324        | 0            | 0s           | 0             |
| create_initial_rest_routes()                    | wp-includes/rest-api.php:178                    | 0.0506s | 0s         | 0           | 100%        | 249        | 0            | 0s           | 0             |
| wp_enqueue_scripts()                            | wp-includes/script-loader.php:1441              | 0.0216s | 0s         | 0           | 100%        | 216        | 0            | 0s           | 0             |
| WPSEO_Frontend->head()                          | wordpress-seo/frontend/class-frontend.php:653   | 0.0436s | 0.0013s    | 1           | 98.99%      | 391        | 4            | 0s           | 0             |
| wp_resource_hints()                             | wp-includes/general-template.php:2893           | 0.0008s | 0s         | 0           | 50%         | 1          | 1            | 0s           | 0             |
| wp_print_head_scripts()                         | wp-includes/script-loader.php:1395              | 0.006s  | 0s         | 0           | 97.7%       | 85         | 2            | 0s           | 0             |
| wptexturize()                                   | wp-includes/formatting.php:51                   | 0.0217s | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| Sensei_Quiz::single_quiz_title()                | sensei-lms/includes/class-sensei-quiz.php:1124  | 0.0255s | 0s         | 0           | 100%        | 1          | 0            | 0s           | 0             |
| Groups_Post_Access::wp_get_nav_menu_items()     | groups/lib/access/class-groups-post-access.php: | 0.0105s | 0s         | 0           | 100%        | 118        | 0            | 0s           | 0             |
| wp_trim_excerpt()                               | wp-includes/formatting.php:3311                 | 0.0586s | 0s         | 0           | 99.17%      | 120        | 1            | 0s           | 0             |
| OMAPI_Output->load_optinmonster()               | optinmonster/OMAPI/Output.php:311               | 0.0034s | 0.0008s    | 1           | 100%        | 43         | 0            | 0s           | 0             |
+-------------------------------------------------+-------------------------------------------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| total (66)                                      |                                                 | 2.0908s | 0.079s     | 51          | 81.77%      | 5319       | 418          | 0s           | 0             |
+-------------------------------------------------+-------------------------------------------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+

Kontrollera att cache-hanteringen i HTTP-fronten fungerar som den ska

Med kommandot curl kan parametern -I användas för att visa header-fälten i svaret från servern, så som visades i ett exempel ovan. En tänkbar användning av detta är att göra det möjligt för utvecklaren att se om det förekommer några header-fält av typen Cache-control, Expires eller liknande i svaren från servern, då dessa kan förhindra att innehållet sparas i cache-minne.

WordPress-miljön hos Seravo innehåller ett extra smidigt kommando för att hjälpa till att kontrollera cache-hanteringens status just för webbplatser som ligger hos Seravo:

$ wp-check-http-cache 
----------------------------------------
Seravo HTTP cache checker
----------------------------------------
Testing https://seravo.com/...
Request 1: MISS
Request 2: HIT
Request 3: HIT
----------------------------------------
SUCCESS: HTTP cache works for https://seravo.com/.
----------------------------------------
You can also test this yourself by running:
  curl -IL https://seravo.com/

(Du kan också testa detta själv genom att köra kommandot: curl -IL https://seravo.com/)

I det här exemplet fungerar cache-hanteringen som den ska. Den första förfrågan är en MISS, men de efterföljande förfrågningarna ger HIT (träff) mot cache-minnet.

På vissa webbplatser kan kommandot varna för att en cookie PHPSESSION är definierad. Webbplatser bör inte sätta cookies för alla besökare då detta leder till att cache-hanteringen inte fungerar. Om du skulle stöta på detta problem kan du ta reda på var i koden det finns anrop till funktionen session_start() som sätter denna cookie. För att söka efter en viss sträng i hela WordPress-installationen kan man använda kommandoradsverktyget grep, som finns förinstallerat på nästan alla Linux-system och andra Unix-baserade system. För webbplatser hos Seravo kan man även använda vårt smidiga lilla hjälpmedel wp-find-code. Där behöver man bara ange den sökta strängen som argument, så ser verktyget automatiskt till att söka i rätt filvägar. Här är ett exempel:

$ wp-find-code session_start
wp-content/plugins/mailpoet/mailpoet_initializer.php:    session_start();

Att kontakta databasen från kommandoraden

Enklaste sättet att kontakta databasen för en WordPress-webbplats är med hjälp av radkommandot wp db cli (under förutsättning att WP-CLI är installerat). Därifrån kan du köra alla SQL-kommandon du vill (och känner till). Ibland kan det vara svårt att minnas de SQL-kommandon man behöver. Därför erbjuder vi hos Seravo även ett par hjälpmedel för att bekvämt visa databastabellerna, deras storlek, analysera deras rader och innehåll en del och optimera databasen.

Hos Seravo hittar du alla dessa kommandon om du kör wp-db- och sedan trycker på tangenten Tab några gånger:

$ wp-db-
wp-db-cleanup    wp-db-dump      wp-db-info     wp-db-load
wp-db-optimize   wp-db-size      wp-db-update

OK, men hur gör jag för att koppla upp mig till SSH och komma igång?

Om du vill prova på de kommandoradsverktyg vi tipsat om här men aldrig använt SSH tidigare rekommenderar vi att du kollar vår SSH-guide på YouTube för att komma igång.

Kommentera

Otto Kekäläinen

Verkställande direktör otto@seravo.se @ottokekalainen

Sök Seravo.se

Mer läsning

Underhåll i världsklass för ett evenemang i världsklass

25.6.2020

Utöver Slush är Nordic Business Forum en av de största framgångssagorna på den finska eventmarknaden. Något som började år 2010 […]

Ladda snabbare genom att ladda senare

18.6.2020

Lazy loading är en teknik som gör att webbsidor kan laddas snabbare. Den enkla idén är att inte hämta de […]

Att komma igång med WordPress

9.6.2020

De första stegen När du beställer ett WordPress-paket från oss skickar vi en orderbekräftelse via e-post med inloggningsuppgifter för inloggning […]