# JIT ja suorituskyky PHP 8:ssa

> PHP JIT ja suorituskyky PHP 8:ssa: miten JIT-kääntäjä toimii OPcachen kanssa, mitkä asetukset pätevät ja miksi päivitykset ratkaisevat nopeuden ja tietoturvan.

Lähde: https://phpsos.de/fi/php/jit-und-performance/  
Tilanne: 25.10.2026  
Palveluntarjoaja: PHP SOS, PHP-hätäapu ja palvelimen tietoturva. Pikaapu WhatsAppilla: https://wa.me/491736494914?text=Hei%20PHP%20SOS%2C%20tarvitsemme%20apua%20PHP-palvelimemme%20kanssa.%20Yritys%3A%20%E2%80%A6%20Verkkosivusto%3A%20%E2%80%A6

**Lyhyesti:** PHP JIT (Just-in-time-kääntäjä) muuntaa usein suoritettavan PHP-koodin ajon aikana konekoodiksi. Se tuli versiossa PHP 8.0, kuuluu OPcacheen ja on versiosta PHP 8.4 lähtien oletuksena pois päältä. Laskentaintensiiviset tehtävät nopeutuvat sillä selvästi, tyypilliset sivustot kuten WordPress tuskin lainkaan. Suuremman hyödyn tuovat OPcache, ajantasainen PHP-versio ja sopivasti säädetty prosessinhallinta, ja jokainen ajantasainen versio tuo samalla tarvittavat tietoturvakorjaukset.

## Mikä JIT-kääntäjä on PHP:ssä?

PHP on tulkittu kieli: lähdekoodi käännetään ensin tavukoodiksi eli opcode-käskyiksi, ja Zend Engine suorittaa ne. JIT menee askeleen pidemmälle. Se seuraa, mitkä koodiosat suoritetaan usein, ja kääntää juuri ne prosessorin konekoodiksi. Siitä lähtien ne toimivat ilman kiertotietä tulkin kautta.

Käyttöönotto-RFC kuvaa JIT:n lähes itsenäisenä osana OPcachea. Tuotettu konekoodi on OPcachen jaetun muistin lisäalueella. Versiossa PHP 8.4 hanke rakensi JIT:n uudelleen; julkaisusivun mukaan uusi toteutus perustuu IR-kehykseen, koodintuotannon yhteiseen välikieleen. Miten moottori toimii sen alla, selittää [Zend Engine](https://phpsos.de/fi/php/zend-engine/).

## OPcache ensin: varsinainen suorituskyvyn perusta

Ilman OPcachea PHP kääntää jokaisen tiedoston uudelleen jokaisella pyynnöllä. OPcache säilyttää tavukoodin jaetussa muistissa, jolloin kaikki workerit käyttävät sitä uudelleen. Sisällönhallintajärjestelmää käyttävälle sivustolle se on ylivoimaisesti tärkein vipu. Versiosta PHP 8.5 lähtien OPcache on hyväksytyn RFC:n mukaan käännetty kiinteästi PHP:hen; tutut ini-asetukset ohjaavat edelleen sitä, onko välimuisti aktiivinen.

Tärkeät oletusarvot käsikirjan mukaan: `opcache.enable=1`, `opcache.enable_cli=0`, `opcache.validate_timestamps=1` ja `opcache.revalidate_freq=2`. Viimeisellä asetuksella OPcache tarkistaa korkeintaan kahden sekunnin välein, ovatko tiedostot muuttuneet. Jos `validate_timestamps` kytketään pois, välimuisti on tyhjennettävä tai PHP käynnistettävä uudelleen jokaisen käyttöönoton jälkeen. Lisää kohdassa [OPcache selitettynä](https://phpsos.de/fi/php/opcache/).

## PHP JIT:n konfigurointi: tilat ja asetukset

JIT:iä ohjataan kahdella direktiivillä:

| Direktiivi | Oletus versiosta 8.4 | Oletus ennen versiota 8.4 | Merkitys |
|---|---|---|---|
| `opcache.jit` | `disable` | `tracing` | JIT:n tila |
| `opcache.jit_buffer_size` | `64M` | `0` | Tuotetun konekoodin muisti, `0` kytkee JIT:n pois |

Asetukselle `opcache.jit` käsikirja tuntee nämä arvot: `disable` (kokonaan pois, ei kytkettävissä päälle ajon aikana), `off` (pois, mutta kytkettävissä päälle ajon aikana), `tracing` eli `on` (suositeltu useimmille käyttäjille) ja `function`. Lisäksi on nelinumeroinen lukukirjoitusasu hienosäätöön.

```ini
; JIT:n kohdennettu käyttöönotto, esim. laskentaintensiivisille workereille
opcache.enable=1
opcache.jit=tracing
opcache.jit_buffer_size=64M
```

Se, toimiiko JIT, näkyy OPcachen tilasta:

```bash
php -i | grep -i "opcache.jit"          # CLI:n asetukset
php --ri "Zend OPcache"                 # OPcache-laajennuksen konfiguraatio
```

Huomatkaa, että komentorivi voi käyttää eri asetuksia kuin PHP-FPM. Verkkokäytössä ratkaisee `phpinfo()`-tuloste FPM-kontekstissa, mieluiten haettuna vain sisäisesti ja poistettuna sen jälkeen.

## Mitä JIT tuo käytännössä?

RFC:n tekijät mittasivat: synteettinen komentosarja bench.php toimi JIT:llä yli kaksi kertaa nopeammin. Todellisissa sovelluksissa hyöty jäi pieneksi; WordPress saavutti 326 pyyntöä sekunnissa 315:n sijaan, ja PHP-jäsennin toimi noin 1,3-kertaa nopeammin. RFC sanoo suoraan, ettei JIT nopeuta merkittävästi todellisia sovelluksia kuten WordPressiä.

Syy on tyypillisten verkkosovellusten profiilissa. Ne odottavat suurimman osan ajasta tietokantaa, tiedostojärjestelmää tai ulkoisia palveluja. Nopeampi prosessoripolku auttaa siellä vähän. Hyötyä voivat sen sijaan saada PHP:ssä tehtävä kuvankäsittely, matemaattiset laskennat, jäsentimet tai pitkään käynnissä olevat workerit.

## Suorituskyky ilman JIT:ä: tehokkaammat vivut

Yrityssivustoille ja verkkokaupoille kannattaa tämä järjestys:

1. **Ajantasainen PHP-versio:** Uudet versiot tuovat optimointeja ja ennen kaikkea tietoturvakorjauksia.
2. **OPcachen oikea mitoitus:** riittävästi muistia ja tilaa kaikille sovelluksen tiedostoille.
3. **PHP-FPM:n sopiva säätö:** sovita `pm.max_children` käytettävissä olevaan keskusmuistiin sokean korottamisen sijaan.
4. **Tietokannan tarkistus:** etsi hitaat kyselyt, aseta indeksit.
5. **Välimuisti sovellustasolla:** sivu- tai oliovälimuisti, missä järjestelmä tukee sitä.
6. **Mittaa arvaamisen sijaan:** PHP-FPM:n `request_slowlog_timeout` kirjoittaa hitaista pyynnöistä backtracen slowlogiin.

## JIT, suorituskyky ja tietoturva

Suorituskyky ja tietoturva liittyvät toisiinsa tiiviimmin kuin miltä näyttää. Ensinnäkin: jokainen lisäkomponentti on lisäkoodia. Käyttöönotto-RFC mainitsee itse JIT:n virheiden riskin koodintuotannossa ja rekisterien varauksessa sekä vianetsinnän vaikeutumisen. Jos et tarvitse JIT:iä mitattavasti, jätä se oletukseen `disable`.

Toiseksi: OPcache ja workerit pitävät koodia muistissa. PHP2Shellin kaltaisen tietoturvapäivityksen jälkeen vanhat prosessit jatkavat vanhalla koodilla, kunnes ne on käynnistetty uudelleen. Pelkkä välimuistin tyhjennys ei korvaa tätä uudelleenkäynnistystä, sillä haavoittuvuudet CVE-2026-109618 ja CVE-2026-109619 ovat itse PHP-binäärissä.

Kolmanneksi: paras suorituskykyhyöty, ajantasainen versio, on samalla tärkein suojatoimenpide. PHP 8.2:n tuki päättyy 31.12.2026; jos siirtyy nyt versioon 8.4 tai 8.5, saa molemmat. Miten pidämme järjestelmät pysyvästi nopeina ja koventtuina, kuvaa [PHP-verkkopalvelinten koventaminen](https://phpsos.de/fi/leistungen/server-haertung/).

## Miten PHP SOS auttaa konkreettisesti?

- **Nykytilan analyysi:** Luemme OPcache-, JIT- ja FPM-asetukset ja vertaamme niitä kuormaan ja keskusmuistiin.
- **Pullonkaulojen mittaus:** Slowlogin ja palvelimen tunnuslukujen avulla selvitämme, missä aika todella menee hukkaan.
- **Turvallinen konfigurointi:** JIT vain siellä, missä se todistettavasti auttaa; OPcache niin, että käyttöönotot ja päivitykset tulevat voimaan siististi.
- **Päivitysten suunnittelu:** Versiovaihdokset testauksella ja dokumentoidulla uudelleenkäynnistyksellä, jotta nopeus ja korjaustaso täsmäävät.


## Usein kysytyt kysymykset

**Onko JIT PHP:ssä oletuksena päällä?**  
Versiosta PHP 8.4 lähtien ei ole: opcache.jit-asetuksen oletusarvo on disable. Aiemmin oletuksena oli tracing, mutta puskuri opcache.jit_buffer_size oli asetettu arvoon 0, joten JIT ei toiminut silloinkaan.

**Nopeuttaako JIT WordPressiä?**  
Tuskin. Jo käyttöönotto-RFC:ssä tekijät kirjoittavat, ettei JIT nopeuta merkittävästi todellisia sovelluksia kuten WordPressiä. Heidän mittausarvonsa nousi 315:stä 326:een pyyntöön sekunnissa.

**Tarvitsenko OPcachen, jos en käytä JIT:ä?**  
Tarvitset. OPcache tallentaa käännetyn tavukoodin jaettuun muistiin ja säästää uudelleenkääntämisen jokaisella pyynnöllä. Se on lähes jokaiselle PHP-sivustolle tärkein suorituskykyvipu. Versiosta PHP 8.5 lähtien OPcache on rakennettu kiinteästi PHP:hen.

**Onko JIT tietoturvariski?**  
Enemmän koodia tarkoittaa enemmän mahdollisia virheitä. Käyttöönotto-RFC mainitsee itse JIT:n virheiden riskin ja vianetsinnän vaikeutumisen. Jos et tarvitse sitä, jätä se pois; jos käytät sitä, asenna päivitykset erityisen nopeasti.

## Lähteet

- [PHP-käsikirja: OPcache- ja JIT-asetukset](https://www.php.net/manual/en/opcache.configuration.php)
- [PHP RFC: JIT (PHP 8.0)](https://wiki.php.net/rfc/jit)
- [PHP RFC: OPcache kiinteänä osana (PHP 8.5)](https://wiki.php.net/rfc/make_opcache_required)
- [php.net: PHP 8.4 -julkaisu](https://www.php.net/releases/8.4/en.php)
