OPcache og JIT-kompilering
Gør PHP hurtigere med bytecode-caching og JIT.
OPcache og JIT-kompilering er en gratis PHP Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i PHP Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. PHP Academy-kurset indeholder 4 lektioner i alt.
Cachelagring af kompileringen
OPcache gemmer kompilerede opkoder i delt hukommelse, så PHP springer leksikalsk analyse, syntaktisk analyse og kompilering over ved hver anmodning. Oven i det kompilerer JIT (siden PHP 8.0) ofte udførte opkoder til native maskinkode. Tilsammen er de rygraden i PHP's ydeevne.
I denne lektion gennemgår du konfiguration af OPcache, forudindlæsning og justering af JIT.
Hvad OPcache gør
Den kompilerede op_array for hver fil cachelagres i et segment i delt hukommelse, som alle FPM-arbejdere bruger. En anmodning, der rammer cachen, genbruger opkoderne direkte. OPcache kører også en optimering (konstantfoldning, eliminering af død kode og sammensmeltning af opkoder), første gang en fil kompileres.
; Core OPcache config (php.ini)
opcache.enable = 1
opcache.memory_consumption = 256 ; MB of shared memory
opcache.interned_strings_buffer = 16 ; MB for interned strings
opcache.max_accelerated_files = 20000 ; cap on cached scriptsValidering af tidsstempler
validate_timestamps afgør, om OPcache kontrollerer filernes ændringstidspunkter igen. I udvikling skal den være aktiveret med en kort revalidate_freq; i produktion skal den sættes til 0, så PHP aldrig henter filstatistik, og du kan udrulle ved at rydde cachen (eller genopbygge containerafbildningen).
; Production: never re-stat files
opcache.validate_timestamps = 0
; Development: check every 2 seconds
; opcache.validate_timestamps = 1
; opcache.revalidate_freq = 2Undersøgelse af cachen
opcache_get_status() rapporterer træfprocent, hukommelsesforbrug og cachelagrede scripts, mens opcache_get_configuration() viser indstillingerne. En lav træfprocent eller hyppige genstarter betyder, at der er for lidt hukommelse eller for mange filer.
<?php
if (function_exists('opcache_get_status')) {
$s = opcache_get_status(false);
if ($s) {
printf("hits: %d\n", $s['opcache_statistics']['hits']);
printf("misses: %d\n", $s['opcache_statistics']['misses']);
printf("hit %%: %.2f\n", $s['opcache_statistics']['opcache_hit_rate']);
printf("used: %.1f MB\n", $s['memory_usage']['used_memory'] / 1048576);
} else {
echo "OPcache enabled but no status (likely CLI)\n";
}
} else {
echo "OPcache not available\n";
}
?>Forudindlæsning
Forudindlæsning (PHP 7.4+) kompilerer et sæt klasser og funktioner én gang ved serverens opstart og beholder dem permanent i hukommelsen, så de er tilgængelige ved hver anmodning uden automatisk indlæsning eller sammenkædning pr. anmodning. Angiv et script i opcache.preload, som indlæser filerne med require for at varme cachen op.
; php.ini
opcache.preload = /app/preload.php
opcache.preload_user = www-dataSkrivning af et forudindlæsningsscript
Forudindlæsningsscriptet kører i masterprocessen. Brug opcache_compile_file() til at indlæse klasser uden at udføre dem, eller brug blot require. Rammeværker genererer en liste til forudindlæsning; her er strukturen for en sådan.
<?php
// preload.php — runs once at startup
$dir = '/app/src';
$rii = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir)
);
foreach ($rii as $file) {
if ($file->getExtension() === 'php') {
// Compiles + links the class into shared memory
opcache_compile_file($file->getPathname());
}
}
?>JIT kommer på banen
Selv med cachede opkoder fortolker VM'en dem stadig. JIT kompilerer ofte udførte opkodesekvenser til native CPU-instruktioner og fjerner omkostningen ved at sende hver opkode gennem VM'en. Gevinsten er stor for CPU-bundet numerisk kode, men beskeden for typiske I/O-bundne webapps, som bruger tiden på database og netværk frem for CPU'en.
Konfiguration af JIT
JIT ligger i OPcache, så OPcache skal være aktiveret. opcache.jit_buffer_size reserverer plads til genereret maskinkode (0 deaktiverer JIT). opcache.jit er en tilstand på fire cifre, der styrer, hvornår JIT udløses, og hvilken optimeringsstrategi der bruges.
; Enable JIT (requires opcache.enable=1)
opcache.jit_buffer_size = 128M
opcache.jit = tracing ; alias for 1254, the common default
; The 4 digits CRTO mean:
; C - CPU optimization flags
; R - register allocation
; T - trigger (when to JIT)
; O - optimization levelTracing-JIT kontra funktions-JIT
Der findes to strategier: funktions-JIT (tilstand 1205) kompilerer hele funktioner ved det første kald; tracing-JIT (1254, standardaliaset tracing) profilerer udførelsen og kompilerer ofte udførte løkker og kodeveje, hvilket ofte giver bedre resultater, fordi den specialiserer sig efter de observerede typer. Tracing er den anbefalede standard.
; Tracing JIT (recommended) — compiles hot traces
opcache.jit = tracing
; Function JIT — compiles entire functions when first called
; opcache.jit = function
; Disable JIT but keep opcode cache
; opcache.jit_buffer_size = 0Måling af JIT's effekt
JIT er bedst til intensive numeriske løkker. Denne selvstændige benchmark (en indre løkke i stil med Mandelbrot) er den type CPU-bundne arbejdsbelastning, hvor JIT kan reducere køretiden markant; kør den med og uden jit_buffer_size for at sammenligne.
<?php
function mandelEscape(float $cr, float $ci, int $max): int {
$zr = 0.0; $zi = 0.0; $n = 0;
while ($n < $max && ($zr * $zr + $zi * $zi) <= 4.0) {
$t = $zr * $zr - $zi * $zi + $cr;
$zi = 2.0 * $zr * $zi + $ci;
$zr = $t;
$n++;
}
return $n;
}
$start = hrtime(true);
$sum = 0;
for ($y = 0; $y < 200; $y++) {
for ($x = 0; $x < 200; $x++) {
$sum += mandelEscape($x / 100 - 2, $y / 100 - 1, 256);
}
}
printf("sum=%d time=%.2f ms\n", $sum, (hrtime(true) - $start) / 1e6);
?>Hvornår du IKKE skal forvente gevinster
Ved en typisk anmodning, der forespørger i en database, gengiver en skabelon og returnerer JSON, udfører CPU'en ikke meget rå aritmetik — JIT giver måske forbedringer på få procent eller slet ingen. Prioritér OPcache, forudindlæsning og god brug af database og cache først. Gem justering af JIT til billedbehandling, matematik, parsere og anden beregningstung kode.
Hurtigt tjek
Hvad giver forudindlæsning dig, som almindelig cachelagring i OPcache ikke gør?
Opsummering
OPcache cachelagrer kompilerede op_arrays i delt hukommelse og kører en optimering; indstil validate_timestamps=0 i produktion, og dimensionér memory_consumption/max_accelerated_files korrekt. Forudindlæsning holder udvalgte klasser permanent i hukommelsen ved opstart. JIT (inde i OPcache og afhængig af jit_buffer_size) kompilerer ofte udført kode til native instruktioner — store gevinster for CPU-bundet matematik, men kun små for I/O-bundne webapps. Brug opcache_get_status() til at kontrollere resultatet.
Lær PHP med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 49
- Lektioner
- 195
Ofte stillede spørgsmål
Er lektionen “OPcache og JIT-kompilering” gratis?
Ja — hele teksten til “OPcache og JIT-kompilering” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af PHP Academy-kurset, skal du opgradere til CoddyKit PRO. PHP Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “OPcache og JIT-kompilering”?
Gør PHP hurtigere med bytecode-caching og JIT. Du øver dig i PHP Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på PHP Academy?
Der kræves ingen tidligere erfaring. PHP Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “OPcache og JIT-kompilering”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne PHP Academy-lektion?
Ja. Alle PHP Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Sådan fungerer Zend Engine
- Hukommelseshåndtering og garbage collection
- OPcache og JIT-kompilering
- Skriv en basal PHP-udvidelse i C