Tehosta WordPressiä komentoriviltä

Kirjoitettu: 28.2.2020

Verkosta löytyy lukemattomia artikkeleita, jotka käsittelevät WordPressin suorituskyvyn tehostamista. Useimmat niistä kuitenkin neuvovat asentamaan lisäosia, vaikka ne usein pikemminkin pahentavat tilannetta ja monimutkaistavat sivustoa entisestään: jokainen uusi lisäosa pitää muistaa pitää ajan tasalla, jonka lisäksi niistä jokainen tuo mukanaan oman valikoimansa uusia asetuksia, jotka pitää opetella.

Onneksi on komentorivi!

SSH-yhteyden yli komentorivillä työskentelyssä on monta hyvää puolta: komentojen suorittaminen on nopeaa ja niiden vaikutuksen seuraaminen on helppoa: niiden tulokset ovat koko ajan näkyvissä. Komentoja on helppo toisintaa leikepöydän avulla tai rakentamalla niistä skriptejä, joka nopeuttaa työskentelyä erityisesti sellaisille henkilöille, jotka työskentelevät useiden sivustojen kanssa.

Mittaa, tee muutoksia, varmista.

Ennen kuin teet minkäänlaisia toimenpiteitä suorituskyvyn parantamiseksi, on tärkeää että määrittelet lähtötilanteen. Näin on mahdollista varmistaa, että muutoksista todella oli hyötyä mittaamalla suorituskyky uudelleen muutosten jälkeen.

Seuraamalla sokeasti satunnaisia ohjeita tai suosituksia saatat vain tehdä hallaa sivustollesi. Suositukset saattavat hyvinkin toimia joillakin sivustoilla, mutta juuri sinun sivustollasi niillä saattaa olla hidastava vaikutus. On ensiarvoisen tärkeää, että tiedät miten mitkäkin toimenpiteet vaikuttavat juuri sinun sivustollasi. Juuri siksi vertailukelpoiset mittaustulokset ennen ja jälkeen ovat mittaamattoman arvokkaita.

Suosikkityökalumme vertailuun on cURL. Sen avulla voit tehdä HTTP-pyynnön ja tarkistaa miten ja miten nopeasti palvelin siihen vastaa.

$ 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

Lisäoptio -I ohjeistaa cURlia näyttämään HTTP-otsakkeet, joista mm. näkee, että palvelin vastasi HTTP/2 200, joka yksinkertaisesti tarkoittaa, että kaikki meni kuten pitää. Argumentti -w puolestaan pyytää työkalua mittamaan sen, miten paljon latenssia on komennon suorittaneen koneen ja palvelimen välillä. Tässä esimerkissä vasteaika on 81 millisekuntia.

Tavallisesti vasteajat vaihtelevat lyhyenkin ajan sisällä, joten kannattaa aina ajaa kaikki mittaukset useamman kerran peräkkäin. Näin teet edellisestä esimerkkikomennosta viisi kertaa ajettavan bash-silmukan:

$ 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

Mikäli palvelimella on käytössä HTTP-välimuisti, kannattaa sille lähettää Pragma: no-cache -otsake argumentilla -H, jolloin pyyntö ohittaa välimuistin ja tuloksia kaivetaan aina WordPressiä pyörittävältä PHP:ltä asti.

Argumentti LC_NUMERIC=C pyytää esittämään ajan esitetään pisteellä pilkun sijasta. Optio -L pyytää cURLia seuraamaan uudelleenohjauksia, mikäli sellaisia on olemassa. Optiot -s ja –o /dev/null/ siivoavat tuloksesta kaiken epäoleellisen, eli lopputuloksena tulostetaan ainoastaan latausten kokonaisaika.

cURL on työkalu, joka on kaikkien käytettävissä. Seravon WP-palvelun asiakkaille olemme räätälöineet komennon wp-speed-test, joka käytännössä tekee hieman edistyneen version edellä esitetystä cURL-silmukasta. Komennolle on mahdollista antaa argumentiksi --cache, jolloin sivu ladataan välimuistista, jonka komento oletusarvoisesti sivuuttaa. Komennolle voi myös määritellä kohteeksi jonkin tietyn yksittäisen sivun. Oletuksena se lataa WordPressin tarjoileman etusivun.

$ 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.

Näin löydät sivustoa hidastavan lisäosan

WP-CLI on cURLin lisäksi toinen työkalu, jota käytämme jatkuvasti. Suosittelemme sen opettelemista, sillä sen avulla voit ohjata WordPressiä näppärästi komentoriviltä käsin. Voit esimerkiksi asentaa ja aktivoida Googlen rakentaman Native Lazyload -lisäosan yhdellä ainoalla komennolla: wp plugin install –activate native-lazyload.

Huomaathan, että cURLia voit käyttää mistä tahansa, sillä se käyttää HTTP-kutsuja, mutta WP-CLI on ajettava palvelimella, jossa WordPress on asennettuna, koska sen pitää päästä käsiksi sen tiedostoihin ja tietokantaan.

cURl ja WP-CLI yhdessä mahdollistavat lisäosien testaamisen yksitellen tavalla, jolla on mahdollista nähdä minkälainen vaikutus kullakin on WordPressin vasteaikoihin. Seuraava yksirivinen tekee viisi nopeusmittausta, sammuttaa lisäosan, tekee samat viisi mittausta ja aktivoi lisäosan uudelleen. Tämä toistetaan sivuston jokaiselle lisäosalle. Näin löydät helposti juuri sen lisäosan, joka tekee sivustostasi hitaan.

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

Seuraavasta kuvakaappauksesta avulla voit havaita, miltä näyttää kun käytössä on erittäin hidas lisäosa. Huomaa, miten sivuston latausajat lyhenevät merkittävästi kun kyseinen lisäosa otetaan pois päältä.

Profilointia WP-CLI:llä

WP-CLI on myös siitä erinomainen työkalu, että sen toiminnallisuutta on mahdollista laajentaa. Yksi hyvä esimerkki käyttökelpoisista lisäominaisuuksista on komento profile. Sen avulla on mahdollista tehdä profilointia, eli paikantaa missä tilassa tai koukussa piilee syy sivuston hidasteluun. Kun kriittinen piste on paikannettu, kehittäjän on helppo sukeltaa syvemmälle koodiin ja korjata ongelma.

Saadaksesi ominaisuuden käyttöön, sinun tulee asentaa se komennolla wp package install wp-cli/profile-command. Alla on muutamia esimerkkejä siitä, miten voit käyttää profilointia.

$ 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             |
+-------------------------------------------------+-------------------------------------------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+

Varmista, että välimuisti on käytössä

cURLin saa näyttämään palvelimen tarjoamat otsakkeet argumentilla -I, aivan kuten näytimme esimerkissä artikkelin alussa. Yksi käyttötarkoitus tälle on tarkistaa tuleeko vastaan otsakkeita Cache-control tai Expires – eli onko palvelimella käytössä jotain, joka estää sisällön välimuistittamisen.

Seravon WordPress-ympäristössä on tarjolla kätevä komento, wp-check-http-cache, jolla on helppo tarkistaa välimuistin tila sivustoilla, jotka ovat ylläpidossa palvelussamme. Seuraavassa esimerkissä ensimmäinen lataus tulee WordPressistä asti, mutta kaksi seuraavaa asianmukaisesti välimuistista.

$ 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/

Joillakin sivustoilla tämä komento saattaa varoittaa, että käytössä on PHPSESSION -eväste. Minkään sivuston ei tule asettaa evästeitä kaikille vierailijoille, koska se estää välimuistin käytön. Mikäli havaitset tällaisen tilanteen, on syytä paikantaa missä päin sivuston koodia kutsutaan funktiota session_start(), joka tämä evästeen asettaa.

Etsiäksesi tiettyä merkkijonoa WordPress-asennuksesta, kannattaa käyttää työkalua nimeltä grep, joka löytyy käytännössä jokaisesta Linux- ja Unix-pohjaisesta järjestelmästä. Seravolla ylläpidettävillä sivustoilla on myös käyttää pikku apuria wp-find-code. Sille tarvitsee ainoastaan antaa argumentiksi kaivattu merkkijono ja se etsii sitä automaattisesti oikeista paikoista.

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

Tietokannan käsittely komentoriviltä

Helpoin tapa lähestyä WordPress-sivuston tietokantaa on käyttää komentoa wp db cli, olettaen että sivustolla on WP-CLI asennettuna. Sen avulla on mahdollista ajaa kaikkia SQL-komentoja. Niiden muistaminen saattaa kuitenkin toisinaan olla haastavaa, jonka vuoksi olemme tehneet ympäristöömme muutamia apukomentoja, joiden avulla on mahdollista tutkia tietokannan tauluja, analysoida sen sisältöä rivi riviltä, sekä jopa optimoida kantaa.

Kaikki nämä komennot saa näkyviin naputtelemalla wp-db- ja painamalla muutaman kerran sarkainta.

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

Miten pääsen tähän kaikkeen käsiksi?

Jos haluaisit kokeilla näitä komentorivi-vinkkejä, mutta et ole koskaan ottanut SSH-yhtyettä, suosittelemme katsomaan aivan ensimmäisenä tämän videon, jolla autamme sinut alkuun SSH:n käytössä.

Kommentoi

Otto Kekäläinen

Hae WP-palvelu.fi:stä

Lue myös

WordPressin haku nopeaksi MariaDB:llä

24.3.2020

WordPressin sisäänrakennettua hakutoimintoa ei voi aina kehua nopeaksi. Se hidastelee helposti varsinkin suurilla sivustoilla, kun tietokannassa on paljon sisältöä. Tätä […]

WooCommerce 4.0 on ulkona

13.3.2020

On olemassa monia hyviä syitä miksi kannattaa valita WooCommerce verkkokaupan alustaksi. Ei ole sattumaa, että se on maailman suosituin verkkokauppa-alusta, […]

TLS 1.1 ja 1.0 historiaan maaliskuussa

10.3.2020

Seravon WP-palvelussa on vuoden 2020 alusta ollut ensisijaisena HTTPS-liikenteen salausprotokollana käytössä TLS 1.3, jonka lisäksi käytössä on TLS 1.2. Sen […]