Praegune olukord: PHP2Shell. Kaks kriitilist PHP turvaauku (CVSS 9,2) lubavad kahjulikku koodi ilma sisselogimata. Paigad alates 21.10.2026.Mida nüüd teha →

OPcache selgitus: PHP baitkoodi vahemälu

OPcache hoiab tõlgitud PHP koodi jagatud mälus. See säästab arvutusaega, kuid nõuab hoolikust väljaveeretamisel, taaskäivitustel ja mitme kliendiga serverites.

Seis Lugemisaeg 4 minPHP teadmised

Lühidalt: OPcache on PHP sisseehitatud baitkoodi vahemälu. Käsiraamatu järgi salvestab see eelkompileeritud baitkoodi jagatud mällu, nii et PHP ei pea skripte igal päringul uuesti laadima ja tõlkima. See kuulub komplekti alates PHP 5.5.0-st. OPcache teeb PHP kiiremaks, kuid ei asenda uuendust: pärast PHP paika tuleb kõik PHP protsessid uuesti käivitada, mitte ainult vahemälu tühjendada.

Mida OPcache täpselt teeb?

Igal päringul peab PHP skripti lugema, jaotama ja opcode'ideks tõlkima, see tähendab Zend Engine'i virtuaalmasina käskudeks. Sadade failidega CMS-i puhul on see palju tööd, mis kordub pidevalt.

OPcache salvestab selle tõlke tulemuse jagatud mällu (Shared Memory). Kõik PHP-FPM teenuse workerid või kõik mod_php-ga Apache'i protsessid pääsevad sellele ligi. Kui fail ei muutu, kasutatakse selle baitkoodi otse uuesti.

OPcache laaditakse Zend-laiendusena, mitte tavalise laiendusena:

; Linux (tee sõltub paketist)
zend_extension=opcache.so
; Windows
; zend_extension=php_opcache.dll

Käsiraamatu järgi tuleb OPcache laadida enne Xdebugi, kui mõlemad on aktiivsed.

Oluline on, kellele jagatud mälu kuulub. PHP-FPM-i puhul loob selle master-protsess ja kõik selle teenuse kõigi poolide workerid kasutavad seda. mod_php puhul kuulub see Apache'i põhiprotsessi juurde. Teenuse taaskäivitus tühjendab vahemälu seetõttu täielikult, üksik uus worker aga mitte. Käsurea jaoks puudub väljakutsete ülene jagatud mälu, sest iga väljakutse on eraldi protsess; seal on OPcache vaikimisi väljas.

Otsustajale piisab nimereeglist: OPcache on tootmisserverites peaaegu alati mõistlik, kuid nõuab väljaveeretamiste ja uuenduste jaoks selget kulgu.

Millised OPcache sätted loevad?

Järgmised väärtused pärinevad PHP käsiraamatu seadistuslehelt. Veerg „Muudetav“ näitab, kus sätet tohib seada: INI_SYSTEM ainult php.ini-s või serveri seadistuses, INI_ALL igal pool.

Direktiiv Vaikeväärtus Muudetav Tähendus
opcache.enable 1 INI_ALL vahemälu sees või väljas, käitusajal saab ainult välja lülitada
opcache.enable_cli 0 INI_SYSTEM vahemälu käsurea jaoks
opcache.memory_consumption 128 INI_SYSTEM jagatud mälu suurus MB-des
opcache.interned_strings_buffer 8 INI_SYSTEM ühiste sõnede mälu MB-des
opcache.max_accelerated_files 10000 INI_SYSTEM vahemällu pandavate skriptide maksimaalne arv
opcache.validate_timestamps 1 INI_ALL kontrollib, kas faile on muudetud
opcache.revalidate_freq 2 INI_ALL kontrolli intervall sekundites, 0 = igal päringul
opcache.restrict_api tühi INI_SYSTEM lubab API funktsioone ainult ühelt teelt
opcache.validate_permission 0 INI_SYSTEM kontrollib failiõigusi praeguse kasutaja suhtes
opcache.validate_root 0 INI_SYSTEM takistab nimekonflikte chrooti korral
opcache.file_cache tühi INI_SYSTEM teine vahemäluaste kettal

Tüüpiline tootmisseadistus võiks välja näha selline. Kontrollige väärtused enne oma rakendusega üle:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
opcache.restrict_api=/var/www/admin-tools

Kes seab opcache.validate_timestamps=0, võidab veidi jõudlust. Siis aga ei märka OPcache muudetud faile enam üldse ja iga väljaveeretamine vajab vahemälu lähtestamist või taaskäivitust.

Vahemälu jälgimine ja sihipärane tühjendamine

OPcache toob kaasa oma funktsioonid, sealhulgas opcache_get_status(), opcache_get_configuration(), opcache_invalidate() ja opcache_reset(). Lühike, ainult lugev pilk täituvusele:

<?php
$status = opcache_get_status(false);
if ($status === false) {
    exit("OPcache ist nicht aktiv.\n");
}
printf("Gecachte Skripte: %d\n", $status['opcache_statistics']['num_cached_scripts']);
printf("Freier Speicher: %.1f MB\n", $status['memory_usage']['free_memory'] / 1048576);

Mitme veebisaidiga serverites ei tohiks iga rakendus saada kõigi teiste vahemälu tühjendada ega välja lugeda. Selleks on mõeldud opcache.restrict_api: API funktsioone tohivad välja kutsuda ainult määratud tee all olevad skriptid.

JIT: masinkoodi kompilaator OPcache'is

Alates PHP 8.0-st sisaldab OPcache JIT-kompilaatorit, mis tõlgib opcode'id masinkoodiks. JIT-RFC järgi on see peaaegu iseseisev osa OPcache'ist ja paneb loodud koodi jagatud mälu eraldi alasse. Seda juhitakse sätetega opcache.jit ja opcache.jit_buffer_size. Alates PHP 8.4.0-st on opcache.jit vaikimisi väärtusel disable. Millal JIT end ära tasub, selgitab artikkel JIT ja jõudlus PHP 8-s.

OPcache ja turvalisus: mis kehtib pärast PHP2Shelli

OPcache ei ole turvatööriist, kuid sellel on turvalisusele tagajärgi. Pärast PHP2Shelli on olulised kolm punkti:

  1. Vahemälu lähtestamine ei ole uuendus. opcache_reset() tühjendab ainult vahemällu pandud skriptid. Aukudega CVE-2026-109618 ja CVE-2026-109619 interpretaator jääb mällu, kuni kõik protsessid on uuesti käivitatud. Kuidas see käib, leiate lehelt PHP-FPM ja kõigi workerite taaskäivitamine.
  2. Sissetoodud kood võib vahemälus edasi elada. Kui faili on manipuleeritud ja hiljem asendatud, võib väljalülitatud ajatempli kontrolli korral vana versioon edasi töötada. Pärast puhastamist kuulub seetõttu juurde taaskäivitus.
  3. Jagatud mälu vajab eraldamist. Mitme kliendiga serverites aitavad iga veebisaidi oma PHP-FPM poolid ning opcache.validate_permission ja opcache.restrict_api. Kataloog opcache.file_cache jaoks tohib olla kirjutatav ainult PHP kasutajale.
Näpunäide

Kontrollige pärast iga uuendust, kas PHP protsesside käivitusaeg on pärast uuendust. Täielik OPcache kõrge tabavusmääraga ei ole tõend, et uus interpretaator töötab.

Kuidas PHP SOS konkreetselt aitab?

  • Seadistuse kontroll: Loeme töörežiimi kaupa välja aktiivse OPcache seadistuse ja sobitame selle teie rakendusega.
  • Väljaveeretamiste kaitsmine: Seame sisse kindla kulgu vahemälu lähtestamiseks ja taaskäivituseks, et ükski vana koodiversioon edasi ei töötaks.
  • Klientide eraldamine: Serveri karastamise raames seame eraldi poolid, restrict_api ja sobivad õigused.
  • Kontroll pärast uuendusi: Tõendame protsesside käivitusaegade põhjal, et uuendatud interpretaator on tõesti aktiivne.

Korduma kippuvad küsimused

Kas OPcache on vaikimisi aktiivne?

OPcache tarnitakse PHP-ga alates PHP 5.5.0-st ja töötab käsiraamatu järgi vaikimisi opcache.enable=1 väärtusega, kui laiendus on laaditud. Kas see on laaditud, sõltub teie paketist või veebimajutajast. Käsureal on OPcache seevastu vaikimisi väljas (opcache.enable_cli=0).

Miks ma näen pärast väljaveeretamist ikka vana koodi?

Tõenäoliselt kontrollib OPcache failimuudatusi ainult vaheaegadega või üldse mitte. Sättega opcache.revalidate_freq ootab see vaikimisi kaks sekundit, sättega opcache.validate_timestamps=0 mitte kunagi. Siis aitab ainult vahemälu lähtestamine või PHP-FPM-i või Apache'i taaskäivitus.

Kas opcache_reset() piisab pärast PHP uuendust?

Ei. opcache_reset() tühjendab ainult tõlgitud skriptidega vahemälu. PHP uuendus asendab interpretaatori ise ja see on laaditud igasse töötavasse protsessi. Selleks tuleb kõik PHP protsessid uuesti käivitada.

Kas JIT on PHP 8.4-s sisse lülitatud?

Käsiraamatu järgi on opcache.jit alates PHP 8.4.0-st vaikimisi seatud väärtusele disable, samal ajal kui opcache.jit_buffer_size on 64M. Varem oli vastupidi: jit väärtusel tracing, puhver 0. Mõlemal juhul ei ole JIT ilma teadliku seadistuseta aktiivne.

Allikad

Kohene kontakt

Iga tund loeb. Kirjutage meile kohe.

Kirjeldage lühidalt süsteemi, PHP versiooni ja tähelepanekut. Võtame teiega ühendust, selgitame olukorra välja ja töötame kaugtööna, kuni intsident on lõpetatud ja dokumenteeritud.

Kohene abi