wordpress opcache är ofta aktiverad, men sällan korrekt inställd: För lite minne, för snäva filgränser och felaktiga tidsstämpelkontroller leder direkt till cachemissar och märkbara laddningstider. I den här guiden kommer jag att visa dig typiska felkonfigurationer, ge dig tillförlitliga riktvärden och förklara hur du kan se om din cache fungerar eller för närvarande håller din CPU upptagen.
Centrala punkter
Följande viktiga aspekter hjälper dig att snabbt känna igen och åtgärda felkonfigurationer.
- MinneRealistisk dimensionering av opcache.memory_consumption
- FilerStäll in opcache.max_accelerated_files så att den matchar kodbasen
- SträngarÖka opcache.interned_strings_buffer för WordPress
- TidsstämplarVälj validate_timestamps och revalidate_freq på ett förnuftigt sätt
- ÖvervakningKontrollera träfffrekvens, omstarter och nycklar regelbundet
Varför felaktiga Opcache-inställningar gör WordPress långsammare
Med Opcache PHP kompilerar din kod en gång och levererar sedan bytekod direkt från arbetsminnet, men felaktiga värden gör att denna fördel försvinner. Om cachen är för liten skriver den ständigt över poster, vilket leder till frekventa omkompileringar och belastningstoppar. För få „accelererade filer“ hindrar också alla nödvändiga PHP-filer från att hamna i cacheminnet, vilket resulterar i undvikbara cachemissar. Om de interna strängarna är för små WordPress förlorar effektivitet med återkommande strängar, vilket är särskilt märkbart med många plugins. Jag kontrollerar sådana effekter via träfffrekvensen, antalet cachade nycklar och omstarter - dessa tre nyckeltal avslöjar mycket snabbt om konfigurationen fungerar.
Rätt dimensionering av minnet: opcache.memory_consumption
Jag ställer in opcache.minnes_förbrukning inte blint till 32 eller 64 MB, eftersom moderna WordPress-installationer snabbt överskrider detta. För mindre bloggar börjar jag med 128 MB, för stora webbplatser planerar jag för 256-512 MB så att poster inte kontinuerligt förskjuts. När webbplatsen växer kontrollerar jag det lediga Opcache-minnet och omstartsräknarna; om omstarterna ökar eller träfffrekvensen minskar ökar jag värdet steg för steg. Ett kort belastningstest efter plugin-uppdateringar visar om cacheminnet har tillräckligt med utrymme eller om det redan arbetar vid sin gräns. Om du installerar ett nytt system kan denna kompakta Konfiguration av OPcache ytterligare orienteringsvärden, som jag sedan anpassar till den faktiska filvolymen.
Ange filindex korrekt: opcache.max_accelerated_files
Med opcache.max_accelererade_filer Jag definierar hur många PHP-filer som cachen får hantera och sätter alltid värdet över det faktiska antalet filer. Jag bestämmer antalet på serversidan, t.ex. via „find . -iname „*.php“ | wc -l“, och lägger till en 20-30-procentig buffert så att WordPress inte stöter på denna gräns efter uppdateringar. Om standardvärdet ligger kvar på cirka 3000 går jag miste om cachelagringspotential och skapar instabil prestanda under belastning. Vid stora installationer hamnar jag ofta i intervallet 10.000-32.500, beroende på plugins, tema och moduler som måste användas. Jag verifierar resultatet genom att jämföra antalet cachade nycklar med gränsvärdet och observera träfffrekvensen under verklig åtkomst.
Den interna strängbufferten som en dold flaskhals
Den opcache.interned_strings_buffer många förbiser, även om WordPress i synnerhet drar stor nytta av internerade strängar. Värden på 16-32 MB fungerar bra i praktiken eftersom teman och plugins använder många återkommande strängar, som jag håller effektivt i minnet. För särskilt stora konfigurationer går jag upp till 64 MB i etapper om minnesanvändningen och strängstatistiken indikerar detta. En för liten buffert ger bort valideringar som annars skulle slå samman många liknande strängar till en minnesplats. Efter justeringen kontrollerar jag om omstarterna minskar och den allmänna svarstiden förblir mer stabil med identisk trafik.
Förstå tidsstämplar: validate_timestamps och revalidate_freq
Med opcache.validate_timestamps Jag kontrollerar om Opcache automatiskt känner igen filändringar, vilket fortfarande är viktigt i produktiva miljöer med uppdateringar. Jag låter validate_timestamps vara 1 och ställer vanligtvis in revalidate_freq på 60 sekunder så att ändrade plugins går live omedelbart utan att ständigt kontrollera hårddisken. I distributionsskript planerar jag en riktad PHP-FPM-omladdning om jag vill aktivera kritiska ändringar omedelbart för att undvika missförstånd. Om du stänger av tidsstämplar för aktiva redaktörer riskerar du gamla artefakter och fel i frontend som är svåra att tilldela. För mer djupgående praktiska frågor om kontroll hjälper det mig att ta en titt på en ren Inaktivering av cachen, som jag använder upprepade gånger per release.
Övervakning som räknas: Träfffrekvens, nycklar, omstarter
Jag mäter framgången för Opcache med opcache_get_status(), eftersom siffror omedelbart avslöjar falska antaganden. En träfffrekvens på minst 99 procent visar att de flesta förfrågningar träffar bytekod och inte kompileras om. Om omstarterna ökar eller om antalet cachade nycklar ligger på gränsen justerar jag minnes- eller accelerated-files-värdet. Jag övervakar också minnesfragmenten, eftersom fragmenterat cacheminne kan leda till plötsliga prestandaförluster. Efter plugin-uppdateringar kontrollerar jag nyckeltalen igen för att säkerställa att cachen förblir konsekvent prestanda och inte bara faller ut under belastning.
opcache_get_status i praktiken: Avläsning av nyckeltal
För att snabbt få en känsla för konfigurationen läser jag ut de viktigaste fälten och jämför dem med mina mål:
- opcache_statistik.träffar/missarKvoten bestämmer träfffrekvensen. Mål: ≥ 99 % under verklig trafik.
- opcache_statistics.num_cached_scriptsMåste vara tydligt nedanför opcache.max_accelererade_filer kvarstår.
- minnesanvändning.använt_minne/fritt_minne/slösat_minne: Visar om minnet är knappt eller fragmenterat.
- opcache_statistik.oom_omstart och hash_återstartOm dessa ökar skalar jag upp minne eller filer.
- interned_strings_usage.buffer_size/used_memory: Anger om strängbufferten är tillräckligt dimensionerad.
Små hjälpmedel som jag kör på skalet eller i en adminväg är användbara:
php -r 'var_export(opcache_get_status(false));'
php -i | grep -i opcache
php -r 'echo count(array_filter(get_included_files(), fn($f) => substr($f,-4)===".php");' Baserat på dessa siffror bestämmer jag om jag ska öka minnet, utöka filindexet eller klocka om revalidate-frekvensen.
Rekommenderade opcache-värden per scenario
I stället för att ge allmänna rekommendationer har jag Standardvärden till kodbasen och hålla varianterna jämförbara. Små till medelstora webbplatser kräver märkbart mindre resurser än butiker med många tillägg. Jag ställer in utvecklingsmiljöer så att ändringar syns utan fördröjning medan jag klockar filkontrollerna i produktionen. I följande tabell sammanfattas de vanliga startvärdena, som jag sedan finjusterar i övervakningen. Om du planerar tillväxt är det bättre att beräkna med en buffert så att releaser inte omedelbart tvingar dig att planera om.
| Scenario | opcache.minnes_förbrukning | opcache.max_accelererade_filer | opcache.interned_strings_buffer | opcache.validate_timestamps | opcache.revalidate_freq | opcache.enable_cli |
|---|---|---|---|---|---|---|
| Liten/medelstor | 128 MB | 10000 | 16 MB | 1 | 60 | 0 |
| Stor | 256–512 MB | 32500 | 64 MB | 1 | 60 | 0 |
| Utveckling | 128–256 MB | 10000-20000 | 16–32 MB | 1 | 0 | 0 |
OPcache i samband med CLI, FPM och WP-CLI
Inte alla Omgivningar använder OPcache på samma sätt, så jag är uppmärksam på skillnader mellan FPM, Apache mod_php och CLI. För WP-CLI-uppgifter har Opcache ofta ingen fördel, vilket är anledningen till att jag vanligtvis lämnar enable_cli på 0. I produktiva stackar använder jag PHP-FPM och schemalägger omladdningar specifikt så att caliente-distributioner inte tömmer cacheminnet okontrollerat. Cronjobs som startar PHP-skript via CLI drar mer nytta av optimerad PHP-kod och I/O än av själva opcachen. Jag dokumenterar dessa sökvägar så att administratörer vet var opcache har effekt och var den inte har det.
Uppvärmning efter driftsättningar: undvik kallstarter
Efter en release är cacheminnet kallt - det är just då många setups kortvarigt kollapsar. Jag planerar därför en Riktad uppvärmning i:
- Efter FPM-omladdningen hämtar jag automatiskt kritiska rutter (hem-, produkt- / bidragssidor, sök- / butiksflöden).
- Jag använder sitemaps eller fördefinierade URL-listor för att prime 100-500 sidor i vågor istället för att översvämma allt på en gång.
- Jag fördelar uppvärmningsbegäran över 1-2 minuter för att undvika CPU-toppar och för att säkerställa att bytekoden laddas konsekvent.
Detta hindrar verkliga användare från att betala för sammanställningsarbetet. I synnerhet för butiker minskar detta steg svarstidstopparna omedelbart efter driftsättningar.
JIT, preloading och filcache: kategorisering för WordPress
Eftersom dessa termer används ofta kommer jag att kategorisera dem för WordPress:
- JIT (opcache.jit)För typiska WP-arbetsbelastningar (mycket I/O, få numeriska hotloops) ger JIT vanligtvis inte någon mätbar vinst. Jag brukar hoppa över JIT i produktion med WordPress.
- Förhandsladdning (opcache.preload)Fungerar bra med tydliga och stabila ramverk. WordPress laddar plugins och teman dynamiskt - förinläsning är felbenägen och kräver mycket underhåll. Jag använder det bara om jag har exakt kontroll över autoload-kedjorna.
- Cache för filer (opcache.file_cache): Kan mildra CLI-jobb eller kortvariga omstarter eftersom bytekod hamnar på disk. För FPM-first-stackar prioriterar jag dock den delade minnescachen; filcachen är mer av ett komplement för verktyg och cronjobs.
Svart lista, säkerhet och kontroll
Jag underhåller också min Opcache-konfiguration Säkerhets- och stabilitetsskäl ren:
- opcache.restrict_api: Begränsar vem som har behörighet att anropa Opcache-funktioner (t.ex. Reset). Jag anger en sökväg här under vilken endast administratörsskript finns.
- opcache.blacklist_filnamnExkludera filer/kataloger som ofta skrivs om (t.ex. kodgeneratorer) för att förhindra "thrashing".
- opcache.spara_kommentarer=1Måste vara aktivt eftersom WP/plugins ofta förlitar sig på dokumentblock/annotationer. Utan kommentarer går metadata förlorad.
- opcache.konsistens_kontrollerAktivera endast i staging för att upptäcka hashkollisioner eller inkonsekvenser; i produktion kostar detta märkbar prestanda.
; Exempel
opcache.restrict_api=/var/www/html/opcache-admin
opcache.blacklist_filename=/etc/php/opcache-blacklist.txt
opcache.spara_kommentarer=1 Flera platser, flera projekt och PHP FPM-pooler
Om flera webbplatser delar en FPM-pool „tävlar“ de om samma Opcache. Jag separerar därför Resursintensiva projekt i sina egna pooler:
- Separata INI-värden för varje pool; det är så här jag dimensionerar minnesförbrukningen exakt efter webbplatsens storlek.
- Ingen ömsesidig förskjutning av bytecode; uppdateringar av en webbplats tömmer inte cacheminnet på den andra.
- Bättre lokalisering av fel: Omstarter och träfffrekvens kan tolkas per applikation.
I konfigurationer med flera webbplatser övervakar jag också om vissa underwebbplatser tar in ett extremt stort antal filer (Builder, WooCommerce, Page Builder). Jag justerar filindexet i enlighet med detta och planerar för mer buffring.
Håller minnesfragmenteringen under kontroll
Även om det totala minnet är tillräckligt kan en fragmenterad cache plötsligt Prestanda sjunker orsak. Jag observerar därför:
- bortkastat_minne och opcache.max_förbrukad_procentOm tröskelvärdet överskrids startar Opcache om. Om sådana omstarter ackumuleras ökar jag minnet och kontrollerar om vissa deployer ändrar många små filer.
- Layout för kodStora plugins som uppdateras ofta orsakar mer fragmentering. Ett samlat utgivningsfönster istället för ständiga mikrouppdateringar hjälper.
- Stora kodsidor (opcache.huge_code_pages): Om systemet stöder stora sidor kan detta minska fragmenteringen och TLB-missarna. Jag ställer bara in den om plattformen är korrekt konfigurerad för det.
Arbetsflöden för utveckling och staging
Under utveckling Synliggörande av förändringar över maximal prestanda. Jag arbetar därför med:
- validera_tidsstämplar=1 och revalidate_freq=0, så att förändringar syns omedelbart.
- Separata INI-filer per miljö (DEV/Stage/Prod) för att förhindra oavsiktliga övertaganden.
- Avaktiverade JIT och stängde av enable_cli, så att WP-CLI förblir snabb och deterministisk.
- Konsekvent avaktiverade debug-tillägg i produktion (t.ex. Xdebug) eftersom de väsentligt förändrar cachelagring och körtidsbeteende.
I containrar är jag uppmärksam på typen av montering (t.ex. nätverks-/bindmonteringar), eftersom frekventa ändringar av tidsstämplar annars utlöser onödiga revalideringar.
Tydligt kategorisera felmönster
Typiska symtom har ofta tydliga orsaker:
- Plötsliga 500s efter uppdateringarKontrollera omstarter, fragmentering och om FPM-omladdningen utlöstes exakt efter kodbytet.
- Inkonsekventa frontändarvalidate_timestamps felaktig eller för stort valideringsfönster valt.
- Permanent låg träffprocentFilindex eller minne för litet; ibland många „missar“ tyder också på ständigt föränderliga byggartefakter.
- Långsamma CLI-jobbenable_cli=0 är vanligtvis korrekt; optimerad kod eller filcache hjälper till här, inte SHM:s opcache.
Snabb checklista för de första 30 minuterna
- Räkna PHP-filer och max_accelerated_files med 20-30 %-buffertar.
- minne_förbrukning till 128-512 MB beroende på webbplatsens storlek; strängbuffert till 16-64 MB.
- validera_tidsstämplar=1 och revalidate_freq till 60 i produktion.
- Efter driftsättning: FPM-omladdning, utlösa uppvärmningsvägar och kontrollera sedan opcache_get_status().
- Övervaka omstarter, träfffrekvens och förbrukat minne och gör riktade justeringar om något avviker från det normala.
- Säkerhet: Begränsa_api set, spara_kommentarer=1 se till att problematiska sökvägar svartlistas om det behövs.
- Valfritt: Separata FPM-pooler för stora platser så att cacher inte ersätter varandra.
Systematisk felsökning: från symptom till orsaker
Jag startar Analys alltid med nyckeltal: Om träfffrekvensen sjunker, omstarter ökar eller nycklar ligger på gränsen, härleder jag specifika steg. Om cacheminnet är fullt ökar jag memory_consumption, om jag når filgränsen ökar jag max_accelerated_files. Om jag ser motsägelsefulla frontend-statusar efter distributioner kontrollerar jag validate_timestamps och tiden för en FPM-omladdning. Om sporadiska 500:or inträffar kontrollerar jag fragmenterad cache och konsumerar felloggar innan jag justerar konfigurationen. Efter varje ändring mäter jag igen tills nyckeltalen och laddningstiderna stämmer överens.
Kortfattad sammanfattning
En stark WordPress-Prestandan börjar med en tillräckligt stor opcache, lämpliga gränser för accelererade filer och en förnuftigt vald intern strängbuffert. I produktion låter jag tidsstämplar vara aktiva, klockar kontrollen och ställer in kontrollerade omladdningar för releaser så att ändringar är live i tid. Jag förlitar mig på mätvärden som träfffrekvens, omstarter och nycklar, eftersom de visar mig objektivt vilken justeringsskruv jag behöver vrida på. Värden från en tabell är utgångspunkter, men övervakning avgör hur jag justerar dem per webbplats. Om du upprätthåller denna disciplin kan du på ett tillförlitligt sätt få korta svarstider från PHP och hålla CPU:n avslappnad även under trafiktoppar.


