
💡 Kuidas vähendada serveri koormust ja kiirendada WordPressi Memcachediga
Ilma vahemäluta WordPress sait meenutab mootorit, mis iga valgusfoori taga nullist soojeneb. Külastaja maandub lehele, PHP paneb selle nullist kokku, tehes andmebaasi 30 kuni 60 päringut. Kümme samaaegset külastajat tähendab kolmesada päringut. Viiskümmend külastajat tekitavad laviini, mis paneb serveri ühendusi katkestama kiiremini, kui jõuad konsoolis käsu lõpuni trükkida.
Probleem pole WordPressis endas. Dünaamiline lehe kokkupanek on vaikimisi olemuslikult raiskav; peaaegu kõik CMS-id töötavad nii. Lahendus on aastatepikkuse kogemusega suure koormusega projektides tõestatud: objektide vahemälu RAM-is Memcachedi abil. Õigesti seadistatud Memcachedi kiht muudab serveri, mis lämbub viiekümne samaaegse kasutajaga, masinaks, mis teenindab sadu ilma ühegi millisekundilise kõhkluseta vastamisajas.
Käime läbi kogu seadistustsükli: deemoni paigaldamisest kuni koormustestini, mis näitab erinevust numbrites. Kõik käsud on testitud Ubuntu 22.04/24.04 ja AlmaLinux 9 peal ning ühilduvad PHP 8.2-8.5-ga.
💡 Kiire ülevaade:
- Paigalda Memcachedi deemon ja seo see turvalisuse huvides localhostiga
- Kompileeri PHP memcached laiendus PECLi kaudu oma PHP versiooni jaoks
- Aseta Automatticu object-cache.php drop-in wp-content kataloogi
- Paigalda Batcache ja seadista advanced-cache.php lehe vahemälu jaoks
- Kontrolli vastuse päiseid brauseri DevToolsi kaudu
- Käivita koormustest k6-ga ja võrdle tulemusi enne ja pärast
Mis on Memcached ja miks su WordPress seda vajab
Memcached on deemon, mis salvestab andmeid ja objekte serveri RAM-i. Erinevalt failipõhisest vahemälust (WP Super Cache, W3 Total Cache, WP Rocket), mis kirjutab valmis HTML-i kettale, töötab Memcached ühe taseme võrra madalamal: andmebaasipäringute tulemused, kokkupandud menüüd, vidinad ja saidi seaded settivad RAM-i ja on mikrosekunditega kättesaadavad ilma uuesti kokkupanekuta.
Praktikas näeb pilt välja selline. Tüüpiline WordPressi leht ilma vahemäluta teeb 30 kuni 60 päringut MySQL-ile. 50 samaaegse külastajaga saab andmebaas poolteist kuni kolm tuhat päringut ja protsessor läheb rikkerežiimi. Memcached püüab valdava enamuse neist päringutest RAM-i tasemel kinni: andmebaas puhkab, protsessor jääb vabaks ja server vastab silmapilkselt.
Tehniliselt töötab Memcached võti-väärtus paaridega. Võti on SQL-päringu räsi; väärtus on serialiseeritud tulemus. Kui WordPress sama lehte uuesti kokku paneb, küsib ta kõigepealt Memcachedilt: „Kas sul on see võti?" ja saab peaaegu alati valmis vastuse ilma ühegi kettapöörduseta.
Tehnoloogia sündis 2003. aastal LiveJournali sees lahendusena äärmuslikele andmebaasikoormuse probleemidele. Täna jooksevad WordPress.com, Wikipedia, Twitter ja tuhanded suure koormusega projektid Memcachedi peal. See on küps, stabiilne ja etteaimatav: täpselt see, mida toodang vajab.
Memcachedi deemoni paigaldamine
Käsitleme kahte peamist stsenaariumi: Ubuntu (22.04/24.04) apt-ga ja AlmaLinux / Rocky Linux 9 dnf-iga. Kohanda käsud oma distributsioonile.
Ubuntu puhul:
1 sudo apt update && sudo apt install memcached libmemcached-tools -y
AlmaLinux / Rocky Linux 9 puhul:
1 sudo dnf install memcached libmemcached -y
Pärast paigaldamist käivitub deemon automaatselt. Kontrolli:
1 systemctl status memcached
Vaikimisi kuulab Memcached pordil 11211 kõigil võrguliidestel. See on turvaauk: sinu vahemälu on kättesaadav kõigile, kes väljastpoolt selle pordini jõuavad. Seepärast seo deemon esmalt localhostiga.
Ava konfiguratsioonifail (/etc/memcached.conf Ubuntus, /etc/sysconfig/memcached AlmaLinuxis) ja veendu, et rida -l 127.0.0.1 on olemas ja pole kommenteeritud. Taaskäivita deemon:
1 sudo systemctl restart memcached
PHP laienduse ehitamine PECLi kaudu
Ainuüksi deemon WordPressi ei kiirenda; vaja on PHP klienti, mis õpetab PHP-d Memcachediga suhtlema. Paigalda memcached laiendus (pane tähele: just memcached d-tähega, mitte memcache). Viimane eemaldati PHP-st alates versioonist 8.0 ja seda ei tohiks kasutada.
Ubuntus paigalda esmalt ehitustööriistad. Asenda oma PHP versioon: php8.4-dev, php8.3-dev või php8.2-dev:
1 sudo apt install php8.4-dev php-pear libmemcached-dev pkg-config make gcc -y
Seejärel ehita laiendus:
1 sudo pecl install memcached
AlmaLinux / Rocky Linux 9 puhul on komplekt sarnane:
1 sudo dnf install php-devel php-pear libmemcached-devel make gcc -y 2 sudo pecl install memcached
Pärast ehitamist tuleb laiendus PHP-s registreerida. Loo INI-fail:
1 echo "extension=memcached.so" | sudo tee /etc/php/8.4/mods-available/memcached.ini 2 sudo phpenmod memcached
AlmaLinuxis on tee erinev: /etc/php.d/memcached.ini.
Kui töötad Plesk Obsidianis, siis käsk PHP töötlejate taaskäivitamiseks pärast laienduse paigaldamist:
1 plesk bin php_handler --reread
Kontrolli, et laiendus laaditi:
1 php -m | grep memcached
Väljund peaks sisaldama memcached. Kui see on tühi, kontrolli INI-faili asukohta ja taaskäivita PHP-FPM: sudo systemctl restart php8.4-fpm.
WordPressi ühendamine Memcachediga
Deemon on paigaldatud; PHP laiendus on laaditud. Nüüd tuleb WordPress Memcachediga ühendada rakenduse tasemel.
Tänane de facto standard on Automatticu ametlik drop-in: wp-memcached GitHubis. Selle on kirjutanud samad arendajad, kes hooldavad Batcache'i ja WordPress.com-i, ning see töötab korrektselt PHP 8.x-ga (sealhulgas 8.4 ja 8.5).
Kopeeri object-cache.php fail repositooriumist oma saidi /wp-content/ kausta. WordPress tuvastab selle automaatselt ja hakkab ilma täiendavate pluginateta kasutama Memcachedi objektipuhvri taustasüsteemina.
Kui Memcachedi port erineb vaikimisi pordist (11211), lisa wp-config.php faili järgmine:
1 $memcached_servers = array( 2 array( '127.0.0.1', 11211 ) 3 );
Lehepuhverdus: Batcache
Objektipuhverdus on pool võitu. Teine pool on valmis HTML-lehtede puhverdamine, nii et PHP-d ei käivitata anonüümsete külastajate puhul üldse. Siin tuleb mängu Batcache, Automatticu plugin, mis salvestab genereeritud lehed samasse Memcachedi.
Põhimõte on lihtne. Külastaja saabub saidile; Batcache kontrollib, kas Memcachedis on selle lehe valmis HTML-koopia olemas. Kui on ja see pole aegunud, serveerib see selle hetkega, minnes mööda kogu PHP ja MySQL ahelast. Kui ei ole või kui külastaja on sisse logitud, genereeritakse leht uuesti ja salvestatakse samaaegselt puhvrisse järgmisteks külastusteks.
Paigaldamine:
Laadige arhiiv alla aadressilt wordpress.org, pakkige see lahti ja laadige fail advanced-cache.php üles kausta /wp-content/ juurkausta. Seejärel avage wp-config.php ja lisage rida, mis lubab vahemälu:
1 define( 'WP_CACHE', true );
Saatke fail batcache.php kausta /wp-content/plugins/ ja aktiveerige plugin halduspaneelis.
Faili advanced-cache.php sees on kommentaaride all kümmekond seadistust. Kõige kasulikumad: max_age (lehe eluiga sekundites, vaikimisi 300 ehk 5 minutit), seconds (sama URL-i uuesti genereerimise intervall) ja unique (ära vahemällu salvesta erinevaid User-Agent'eid eraldi). Enamiku saitide puhul töötavad vaikeväärtused; muutke neid ainult siis, kui mõistate, miks.
Oluline nüanss: veenduge, et define( 'WP_CACHE', true ) asuks failis wp-config.php ENNE rida require_once ABSPATH . 'wp-settings.php'. Kui see paigutatakse pärast, siis vahemälu ei aktiveeru ja WordPress ignoreerib seda vaikimisi.
Video: paigaldus ja seadistamine algusest lõpuni
Teooria on alus, kuid konsoolikäske on kõige parem üks kord näha. See video hõlmab kogu WordPressi objektivahemälu seadistamise tsüklit Redis'e ja Memcached'iga alates deemoni paigaldamisest kuni tulemuse kontrollimiseni:
Veendume, et Memcached töötab
Parim test on praktiline. Lisa advanced-cache.php faili kohandatud päis, et saaksid visuaalselt näha, kas leht serveeriti vahemälust või loodi uuesti.
Otsi advanced-cache.php failist see rida:
1 var $headers = array();
Asenda see järgmisega:
1 var $headers = array( 'memcached' => 'activated' );
Nüüd ava oma brauseris DevTools (F12), mine Network vahekaardile ja laadi lehte mitu korda uuesti. Response Headers jaotises näed välja memcached: activated, mis tähendab, et Batcache töötas ja leht läks kliendile otse RAM-ist.
Lisameetod hõlmab serveri käsurida. Vaata deemoni statistikat:
1 echo "stats" | nc 127.0.0.1 11211
Väljundist otsi get_hits ja get_misses. Kui get_hits kasvab saidi lehtede brauseris värskendamisel, serveerib Memcached vahemällu salvestatud objekte usaldusväärselt.
Koormustestimine: numbrid, mitte muljed
Memcached näitab oma tõelist väärtust surve all. Algne test serveris, millel oli 1 tuum ja 512 MB mälu, andis muljetavaldava kontrasti: ilma Memcachedita jooksis server 50 samaaegse kasutajaga 15 sekundi pärast kokku; Memcachediga pidas see 400+ kasutajaga vastu 50 sekundit ilma ühegi veata. See pole maagia, vaid füüsika: kui protsessor ei kuluta tsükleid samade lehtede uuesti kokkupanemisele, teenindab see uusi külastajaid.
Tänapäeval kasutatakse enesetestimiseks moodsaid tööriistu. Üks mugavamaid on k6 Grafana poolt (avatud lähtekoodiga, töötab ühe käsuga). Lihtne test:
1 k6 run --vus 100 --duration 30s http://your-site.com/
100 virtuaalkasutajat 30 sekundi jooksul. Võrdle tulemusi, kui Batcache on keelatud (kommenteeri välja WP_CACHE) ja lubatud; edukate vastuste ja mediaanlatentsuse erinevust mõõdetakse suurusjärkudes.
Kiireks kontrolliks ilma tarkvara installimata sobib hästi veebitööriist Loader.io; tasuta pakett võimaldab kuni 10 000 klienti testi kohta, mis on enamiku saitide jaoks enam kui piisav.
Redis või Memcached: kumba valida
Paratamatult tekib küsimus, miks mitte Redis? Mõlemad on mälusisesed võtme-väärtuse salvestid; mõlemad töötavad WordPressiga drop-in failide kaudu. Lühike vastus: puhtaks vahemällu salvestamiseks on Memcached lihtsam ja kiirem; kõigeks muuks on Redis.
Võrdleme põhialuseid:
Kriteerium | Memcached | Redis |
|---|---|---|
Andmemudel | Ainult stringid | Stringid, loendid, hulgad, räsid, geoandmed, pub/sub |
Mitmelõimelisus | Kasutab kõiki tuumi kohe algusest | Peamiselt ühelõimeline |
Püsivus | Puudub (puhas mälusisene) | RDB/AOF (salvestab kettale) |
WordPressi ökosüsteem | Automattic/wp-memcached + Batcache | Redis Object Cache (400 000+ installi) |
Seadistamise keerukus | Minimaalne | Veidi kõrgem |
Vahemälu tühjendamine taaskäivitamisel | Täielik (kuid soojeneb minutitega) | Võib säilitada |
WordPressi objektide vahemällu salvestamiseks on string-võti-väärtus enam kui piisav. Redis'e täiendavaid andmetüüpe pole siin vaja. get/set operatsioonide puhul piirab mõlemat pigem võrgu läbilaskevõime kui protsessor; kui kõik muu on võrdne, on need samaväärsed. Memcached võidab mitmelõimelisuse osas: see kasutab kõiki protsessorituumi kohe algusest, samas kui Redis säilitab valdavalt ühelõimelise arhitektuuri.
Vali Redis, kui salvestad ka sessioone, ülesannete järjekordi või vajad püsivust. Ülesande „WordPressi kiirendamine ja andmebaasi koormuse vähendamine" täidab Memcached kiiremini ja vähemate liikuvate osadega.
⁉️🤔 Korduma kippuvad küsimused
Kas ma vajan Memcachedi jagatud majutusel?
Enamikus jagatud majutuse pakettides pole Memcached saadaval: teenusepakkujad ei anna juurdepääsu deemonile serveri tasemel. Kui aga sinu pakett sisaldab VPS-i või dedikeeritud serverit, võtab paigaldamine aega 10 kuni 15 minutit ja annab ühe märgatavaima kiiruse kasvu kõigi WordPressi optimeerimiste seas. Kontrolli oma paketi võimalusi juhtpaneelist või küsi majutuse toelt.
Batcache või WP Rocket: kumb on parem?
WP Rocket on multitööriist, mis tegeleb lehe vahemällu salvestamise (failipõhine), CSS/JS optimeerimise ja laisa laadimisega. Batcache on kitsas tööriist spetsiaalselt Memcachedi lehe vahemällu salvestamiseks. Need ei konkureeri, vaid täiendavad teineteist: Batcache töötab serveri tasemel ja serveerib lehti PHP-d käivitamata, samas kui WP Rocket töötab rakenduse tasemel. Praktikas kasutatakse sageli mõlemat: Batcache'i anonüümsetele külastajatele, WP Rocketit peenhäälestatud optimeerimiseks.
Kuidas Memcachedi vahemälu tühjendada?
Lihtsaim meetod on deemoni taaskäivitamine:
sudo systemctl restart memcached. Vahemälu tühjeneb täielikult ja hakkab järgnevate külastustega uuesti soojenema. Sihipäraseks tühjendamiseks kasuta Query Monitor pistikprogrammi: see näitab objektivahemälu sisu ja võimaldab üksikuid võtmeid tühjendada. Olemas on ka konsooli valik:echo "flush_all" | nc 127.0.0.1 11211.
Miks sait pärast object-cache.php paigaldamist kiiremaks ei muutunud?
Kõige levinum põhjus on see, et PHP laiendus ei laadinud. Kontrolli:
php -m | grep memcached. Kui väljund on tühi, kontrolli INI-faili teed ja taaskäivita PHP-FPM. Teine levinud põhjus:object-cache.phpei kopeeritud kausta/wp-content/või kopeeriti õiguste vigadega (see peab olema loetav PHP-d käitava kasutaja poolt). Kolmas: Memcachedi deemon ei tööta; kontrolli:systemctl status memcached.
Kas Memcached on vastuolus OPcache'iga?
Ei, need on erinevad kihid. OPcache salvestab kompileeritud PHP baitkoodi vahemällu ja kiirendab interpretaatori käivitumist. Memcached salvestab vahemällu rakenduse andmeid: andmebaasi päringute tulemusi. Need töötavad päringu töötlemise erinevates etappides ja täiendavad teineteist hästi. Tootmiskeskkonnas on soovitatav kasutada mõlemat.
Kas Memcachedi saab kasutada mitme serveri vahel?
Jah, see on üks peamisi stsenaariume.
$memcached_serverskonfiguratsioonis saad loetleda mitu Memcachedi deemonite IP-aadressi ja klient jaotab võtmed nende vahel automaatselt. WordPressi puhul tegeleb sellegaobject-cache.phpdrop-in: see toetab serverite kogumit kohe algusest.
Kas peaksite Memcachedi oma serverisse paigaldama
Memcachedi paigaldamine ei ole imerohi, kuid üks tõhusamaid samme WordPressi optimeerimisel. Kui teie sait töötab VPS-il või dedikeeritud serveris ja soovite, et see taluks mitmekordset liikluse kasvu ilma riistvara vahetamata, paigaldage see. Kümme kuni viisteist minutit konsoolitööd ja andmebaas lakkab olemast pudelikael.
Kui sait on jagatud majutusel ilma juurdepääsuta deemonile, kaaluge Redist (sagedamini pakutav) või failipõhist vahemällu salvestamist WP Rocketi kaudu. Kui olete juba VPS-il, avage terminal ja järgige ülaltoodud kiirülevaate samme. Tulemust näete oma esimeses koormustestis.



