PHP OPcache snabbar upp mina skript eftersom PHP kompilerar byte-kod i minnet och därmed sparar tid på att analysera om. I den här guiden visar jag hur jag använder OPcache. konfigurera, övervakar och finjusterar så att din applikation reagerar mätbart snabbare och lugnt hanterar belastningstoppar.
Centrala punkter
- Bytecode-cache minskar CPU-belastningen och I/O
- Parametrar Hur man väljer memory_consumption och max_accelerated_files på ett målinriktat sätt
- Omgivningar Ställ in differentierat: Dev, Staging, Produktion
- Övervakning för träfffrekvens, beläggning, evictions
- Utplacering och cache-flush rent integrera
Så fungerar OPcache: Bytecode istället för omkompilering
Vid varje förfrågan läser PHP normalt in filer, analyserar koden och skapar byte-kod, som Zend Engine utför. OPcache sätter in just här och lagrar denna bytecode i det delade minnet så att efterföljande förfrågningar startar direkt från minnet. Detta minskar CPU-cykler och filåtkomst, vilket märkbart förkortar svarstiderna. I typiska installationer uppnår jag därmed vinster på mellan 30 och 70 procent, beroende på kodbas och trafikprofil. Det är viktigt att cachen är tillräckligt stor och att de viktigaste skripten lagras permanent i Minne kvarstår.
Kontrollera och aktivera OPcache på Linux, Windows och delad hosting
Jag börjar alltid med att titta i phpinfo() och söka efter „Zend". OPcache“ samt nycklar som opcache.enable eller opcache.memory_consumption. Under Linux aktiverar jag modulen via paketet php-opcache och en opcache.ini i conf.d-katalogen. I Windows räcker det med en post zend_extension=opcache i php.ini och en omstart av webbservern. I delad hosting aktiverar jag ofta OPcache via en användardefinierad php.ini eller via kundmenyn. Vid flaskhalsar kontrollerar jag dessutom Öka PHP-minnesgränsen, så att OPcache och PHP-FPM har tillräckligt med Resurser bevara.
De viktigaste knapparna förklarade på ett begripligt sätt
Med opcache.enable aktiverar jag cachen för webbförfrågningar, medan opcache.enable_cli styr användningen för CLI-jobb, vilket är värdefullt för arbetsköer. Kärnan utgörs av opcache.memory_consumption, som anger det tillgängliga delade minnet i megabyte; för snävt beräknat leder till evictions och nya Sammanställningar. opcache.max_accelerated_files definierar hur många filer som får hamna i cachen; detta värde bör överstiga antalet filer i projektet på ett rimligt sätt. Med opcache.validate_timestamps och opcache.revalidate_freq bestämmer jag hur strikt OPcache ska kontrollera ändringar i filer, från mycket dynamiskt (utveckling) till mycket sparsamt (produktion med manuell tömning). Jag säkerhetskopierar kommentarer med opcache.save_comments=1, eftersom många verktyg på DocBlocks är beroende av.
Startvärden och profiler i jämförelse
För en smidig start satsar jag på tydliga profiler för utveckling, staging och produktion. På så sätt får jag snabba feedbackcykler vid kodningen och tillförlitlig prestanda i live-drift. Det är viktigt att du regelbundet kontrollerar och justerar dessa startvärden mot verkliga mätvärden. Vid större WordPress-installationer planerar jag generöst med minne och poster, eftersom plugins och teman kräver mycket Filer . Följande tabell sammanfattar lämpliga utgångsvärden, som jag sedan finjusterar utifrån träfffrekvens och evictions.
| Inställning | Utveckling | Staging/Test | Produktion |
|---|---|---|---|
| opcache.enable | 1 | 1 | 1 |
| opcache.enable_cli | 0 | 0–1 | 1 (vid CLI-jobb) |
| opcache.minnes_förbrukning | 128–256 MB | 256–512 MB | 256–512+ MB |
| opcache.interned_strings_buffer | 16–32 MB | 32–64 MB | 16–64 MB |
| opcache.max_accelererade_filer | 8 000–10 000 | 10 000–20 000 | 10 000–20 000+ |
| opcache.validate_timestamps | 1 | 1 | 0–1 (beroende på distribution) |
| opcache.revalidate_freq | 0–2 s | 60–300 s | 300+ s eller 0 (med manuell kontroll) |
| opcache.save_comments | 1 | 1 | 1 |
| opcache.fast_shutdown | 1 | 1 | 1 |
Denna matris är medvetet pragmatisk, eftersom verkliga projekt växer på mycket olika sätt. Jag börjar med dessa värden och observerar sedan träfffrekvensen, den upptagna andelen av det delade minnet och förekomsten av evictions. Vid tecken på tryck ökar jag först opcache.memory_consumption i måttliga steg. Därefter justerar jag opcache.max_accelerated_files tills antalet filer passar in bekvämt. På så sätt förblir Cache effektivt och förfrågningarna fortsätter att komma in i jämn takt.
Inställningar efter miljö: utveckling, staging, produktion
I utvecklingen är det viktigt att få snabb feedback på kodändringar, därför sätter jag validate_timestamps=1 och revalidate_freq mycket lågt eller till och med 0. På staging kontrollerar jag realistisk belastning och sätter generöst med minne så att resultaten kommer nära den senare live-driften. I produktionen höjer jag testfrekvensen eller inaktiverar tidsstämplar helt om min distribution därefter tömmer cachen på ett målinriktat sätt. För CLI-baserade arbetare aktiverar jag enable_cli=1 så att återkommande jobb också kan köras från Bytecode-cache dra nytta av. På så sätt skapar varje miljö precis det beteende jag behöver, utan överraskningar när det gäller reaktionstider.
Avancerade inställningar som ofta gör skillnad
Utöver basparametrarna finns det reglage som jag kan använda för att öka stabiliteten och säkerheten och minimera bieffekterna:
- opcache.max_wasted_percentage: Definierar vid vilken fragmenteringsgrad OPcache initierar en intern omskapning av minnet. Vid kraftigt varierande kodbaser minskar jag värdet något för att få mindre „blandat“ minne.
- opcache.force_restart_timeout: Tidsperiod i sekunder efter vilken OPcache utför en tvingad omstart om en omstart är nödvändig men processer fortfarande är aktiva. Detta förhindrar mycket långa övergångsperioder.
- opcache.file_update_protection: Skyddsfönster i sekunder under vilket nyligen ändrade filer inte cachelagras omedelbart. Detta hjälper mot halvskrivna filer under distributioner eller på nätverksenheter.
- opcache.restrict_api: Begränsar vilka skript som får anropa opcache_reset() och statusfunktioner. I produktion ställer jag in detta strikt så att endast administrationsändpunkter har åtkomst.
- opcache.blacklist_filename: Fil där jag hanterar mönster som utesluts från cachen (t.ex. högdynamiska generatorer). Detta sparar utrymme för mer kritiska skript.
- opcache.validate_permission och opcache.validate_root: Aktiva när flera användare/chroots är inblandade. På så sätt förhindrar PHP att cachad kod från en kontext används otillåtet i en annan.
- opcache.use_cwd och opcache.revalidate_path: Styr hur OPcache identifierar skript när sökvägar integreras via olika arbetsmappar/symlänkar. Vid release-symlänkar testar jag dessa värden specifikt för att undvika dubbla cacher.
- opcache.cache_id: Om flera virtuella värdar delar samma SHM (sällsynt), separerar jag cacharna tydligt med hjälp av ett unikt ID.
- opcache.optimization_level: Jag lämnar vanligtvis inställningen på standard. Endast vid felsökning av extrema fall minskar jag optimeringspass temporärt.
Förladdning: Behåll delar av koden permanent i minnet
Med PHP 7.4+ kan jag ladda och länka centrala ramverks- eller projektfiler vid serverstart via opcache.preload och opcache.preload_user. Fördelen: klasser är tillgängliga utan autoload-träffar och hot paths är omedelbart tillgängliga. Några praktiska regler:
- Förladdning är särskilt fördelaktigt för stora, stabila kodbaser (t.ex. Symfony, egna kärnbibliotek). För WordPress använder jag det med försiktighet, eftersom kärnan/plugins uppdateras oftare.
- En förladdningsfil innehåller specifika opcache_compile_file()-anrop eller integrerar en autoloader som definierade klasser. i förväg laddar.
- Varje kodändring i preload-relevanta filer kräver en omstart av PHP-FPM för att preload ska byggas om. Jag integrerar detta i distributionerna.
- Jag mäter effekten separat: inte alla koder drar nytta av detta; förladdning förbrukar dessutom delat minne.
JIT och OPcache: fördelar, begränsningar, minnesbehov
Sedan PHP 8 finns Just-In-Time-Compiler (JIT), som styrs via OPcache (opcache.jit, opcache.jit_buffer_size). För typiska webbarbetsbelastningar med I/O- och databasbelastning ger JIT ofta liten effekt. Vid kod med hög CPU-belastning (t.ex. bild-/databehandling) kan det ge märkbar hjälp. Jag gör så här:
- Jag aktiverar JIT konservativt och mäter verkliga användarstatistik och CPU-profiler. Blind aktivering ökar minnesbehovet och kan utlösa edgecases.
- Jag dimensionerar JIT-bufferten beroende på CPU-tunga rutter. För små buffertar ger inget mervärde, för stora tränger undan bytecode.
- Om träfffrekvensen eller SHM-användningen påverkas negativt prioriterar jag OPcache framför JIT. Bytecode-cache är det viktigaste verktyget för de flesta webbplatser.
Filvägar, symlänkar och säkra distributionsstrategier
OPcache är sökvägsbaserat. Därför fokuserar jag på distributionsstrategin:
- Atomic Releases via symlink (t.ex. /releases/123 -> /current): Rent, men var uppmärksam på opcache.use_cwd och realpath-beteende. Jag undviker dubbla cacher genom att alla arbetare konsekvent ser samma verkliga sökväg.
- Med validate_timestamps=0 måste cachen överallt tömmas: efter omkopplingen spolar jag OPcache på alla värdar/pods och rullar om PHP-FPM på ett kontrollerat sätt.
- Jag anpassar realpath_cache_size och realpath_cache_ttl till OPcache så att filuppslagningar förblir snabba och stabila.
- På nätverksenheter (NFS/SMB) ökar jag file_update_protection och utformar distributioner så att filer ersätts atomärt.
För mycket snabba omstarter använder jag ofta en tvåstegsprocess: först uppvärmning i bakgrunden, sedan en kort, koordinerad omladdning av alla arbetare, så att den första live-trafiken redan hittar en uppvärmd cache.
Filcache, uppvärmning och priming
Förutom delat minne kan OPcache valfritt skriva bytecode till hårddisken (opcache.file_cache). Detta är till hjälp i vissa speciella situationer:
- I container-miljöer kan en filcache mellan FPM-omstarter Minska kompileringstiderna, förutsatt att lagringsutrymmet är snabbt.
- Jag använder opcache.file_cache med försiktighet: på långsamma eller distribuerade filsystem ger det inte mycket och ökar komplexiteten.
- opcache.file_cache_only är ett specialfall för miljöer utan SHM – ovanligt för prestandakonfigurationer.
För uppvärmningen skapar jag små „primers“:
- Ett CLI-skript anropar opcache_compile_file() för heta filer, t.ex. autoloader, centrala ramverksklasser, stora hjälpfunktioner.
- En crawler besöker de viktigaste sidorna (hemsida, inloggning, kassa) så att bytecode och efterföljande cacher är uppvärmda i tid.
- Jag planerar uppvärmningen så att den är klar strax innan versionen byts.
OPcache i stacken: PHP-FPM, objektcache och sidcache
OPcache visar sin styrka framför allt i kombination med PHP-FPM, en ren processkonfiguration och ytterligare cache-lager. I WordPress kombinerar jag det med en objektcache (till exempel Redis) och en sidcache för att avlasta databasen och renderingen. För detta ändamål är jag noga med att Enkelsträngad prestanda, eftersom PHP-förfrågningar är starkt beroende av enskilda CPU-kärnor. Om det ändå uppstår tryck fördelar jag belastningen över PHP-FPM-Worker utan att välja ett för litet delat minne från OPcache. På så sätt använder jag Stack helt, istället för att bara vrida på en justeringsskruv.
Frekventa fel och snabba kontroller
En för liten cache leder till evictions, vilket jag kan se i OPcache-status eller phpinfo(). Om detta inträffar ökar jag opcache.memory_consumption stegvis och kontrollerar effekten via träfffrekvensen. Om filerna förblir oförändrade sätter jag opcache.max_accelerated_files högre än den faktiska filmängden i projektet. Vid distributionsproblem kontrollerar jag validate_timestamps: Med 0 förblir gammal bytecode aktiv tills jag uttryckligen tömmer cachen. Verktyg som Doctrine kräver DocBlocks, därför låter jag save_comments=1 för att Fel genom att undvika bristande anteckningar.
Övervaka och tolka OPcache
Jag mäter träfffrekvensen och strävar efter att uppnå värden nära 100 procent så att förfrågningar nästan alltid startar från cachen. Dessutom övervakar jag minnesanvändningen och antalet evictions för att upptäcka flaskhalsar i ett tidigt skede. Med opcache_get_status() skapar jag små dashboards eller matar befintliga övervakningslösningar. På så sätt ser jag omedelbart trender efter releaser eller plugin-uppdateringar. Med dessa mätvärden kan jag fatta välgrundade beslut. Beslut och anpassa bara det som verkligen är nödvändigt.
Konkreta riktlinjer som har visat sig fungera:
- Hitrate > 99 % under normal och maximal belastning; under detta kontrollerar jag filfördelning och uppvärmning.
- Fri SHM-andel konstant > 5–10 %; annars skalar jag minnet.
- Evictions över tid: Engångsutslag efter distribution är okej; kontinuerliga evictions tyder på underdimensionering eller stark fragmentering.
- Håll koll på slösat minne: Om det når gränsen planerar jag en kontrollerad OPcache-återuppbyggnad (t.ex. under underhållsfönster).
Exempel: WordPress-installation med hög trafik
För stora WordPress-webbplatser väljer jag opcache.enable=1 och opcache.enable_cli=1 så att även CLI-Worker kan dra nytta av det. Jag ställer gärna in Shared Memory på 384 MB eller högre om det finns många plugins och ett funktionsrikt tema. Jag ökar opcache.interned_strings_buffer till 64 MB, eftersom många klass- och funktionsnamn återkommer i alla förfrågningar. För extremt prestandastarka miljöer ställer jag in validate_timestamps=0 och revalidate_freq=0, men tömmer cachen direkt efter varje release. Det är viktigt att utforma distributioner så att inga gamla byte-kod förblir i omlopp.
Praktisk arbetsflöde för tuning och distributioner
Jag arbetar i fasta cykler: mäta, ändra, kontrollera. Först säkerställer jag statusvärden som träfffrekvens, beläggning och evictions, sedan justerar jag en parameter och mäter igen. Innan en release raderar jag OPcache med inaktiverade tidsstämplar, antingen genom att starta om PHP-FPM eller med ett litet skript. Därefter kontrollerar jag belastningstoppar med verklig trafik eller representativa benchmarks. Om något onormalt uppträdande upptäcks kontrollerar jag även Minnesfragmentering, eftersom de har den användbara Delad Minnet försämras.
Några ytterligare rutiner som har visat sig fungera bra i team:
- Versionshantering av parameterändringar: opcache.ini i repo, ändringar via pull request och changelog.
- Canary-Deploys: Först laddar en del av arbetarna/podarna nya versioner och bygger upp cacheminnet, sedan rullar man ut till alla instanser.
- Nödknapp: En intern administratörsändpunkt med säker åtkomst som tillåter opcache_reset() och riktade opcache_invalidate()-anrop – i kombination med opcache.restrict_api.
- Uppskatta storleken: Som en grov tumregel beräknar jag initialt 1–2 MB OPcache per 100–200 PHP-filer och justerar sedan utifrån de faktiska mätvärdena. För WordPress med många plugins lägger jag till buffert.
Kortfattat sammanfattat
OPcache gör PHP-applikationer snabbare genom att kompilera byte-kod i RAM-minnet. Med lämpliga inställningar för minne, antal filer och tidsstämpelstrategi uppnår du konstant korta svarstider. Se till att det stämmer överens med PHP-FPM och andra cache-lager så att hela stacken fungerar smidigt tillsammans. Övervaka träfffrekvens, beläggning och evictions så att du kan göra målinriktade justeringar. På så sätt säkerställer du en prestandastark och pålitlig Plattform för hög belastning och tillväxt.


