Debian 12 + PHP <= 7.3 + Opcache = szívás

Figyelj, ha a sury.org repóból régebbi PHP verziókat (<=7.3) használsz, és a Debian 11 (Bullseye) rendszeredet Debian 12 (Bookworm) verzióra frissítenéd!
A Debian 12-es csomagokban a Zend Opcache el van törve. Azt fogod észrevenni, hogy egyes oldalgenerálások a timeout-ig futnak és 100% CPU-t esznek!

Workaroundként, az opcache kikapcsolása megoldani látszik a problémát.

A probléma reprodukálásához ezt a kódrészletet sikerült összehoznom:

$x = 0;
$y = hexdec("0200");

for ($i = 0; $i < 100; $i++) {
    if ($x >= $y) {
        $i += $y % 4;
        $x = 0;
    }

    $x++;
}

Ez a kód ilyen formában nekem 100%-os reprodukálhatósággal lerohad PHP 7.3 FPM használatával, ha az opcache be van kapcsolva.

Ugyanakkor:

Bár a var_dump($y) típusa és értéke int(512), de ha csinálok rá type cast-ot, akkor a kód máris nem rohad le:

$y = (int)hexdec("0200");

Az if() feltételben található kifejezésnek soha nem szabad teljesülnie, mert a ciklus 100-szor jár körbe, és a $x soha nem lesz nagyobb vagy egyenlő 512-vel, de ha az if()-en belül megváltoztatom a $i += $y % 4; értékadást $i += 5; -re, akkor szintén nem rohad le.

You have been warned.

Hozzászólások

Ah, de remek! Azert 2023-ra eljutunk oda hogy mar az alapműveketekkel végzett alap műveletek sem megbizhatóak. De legalább a python-al ellentétben nem definiálták át, örüljünk inkább annak!

az opcache arra valo hogy elsokorben egybol kikapcsolja az ember. sok ilyen magicba belefutottunk mi is.

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Egyetertek, olcsobb a tobb eroforras, mint az ilyen bizarr dolgokkal szivni.

Erdekessegbol raneztem:

Amugy ha leforditod a kezzel az opcachet, akkor -O1-el jol fut, de -O2-vel mar nem.

A -Wall -Wextra flagekre is eleg sok a warning forditas kozben.

UBSAN-al forgatva is szep hibakat dobal menet kozben, valoszinuleg valami UB optimalizacio miatt vagy vegtelen vagy csak jo hosszu ciklusba kerul.

pl:

/php7.3-7.3.33/ext/opcache/Optimizer/zend_inference.c:578:24: runtime error: signed integer overflow: -9223372036854775808 + -9223372036854775807 cannot be represented in type 'long int'

/php7.3-7.3.33/ext/opcache/Optimizer/zend_inference.c:579:24: runtime error: signed integer overflow: 9223372036854775807 + 99 cannot be represented in type 'long int'
 

Jól értem hogy olyan verzióval vesződtök, aminek a security patchelését is abbahagyták 2 éve?

vajon ubuntu 22 is erintett? eddig meg nem jott elo nalunk, igaz foleg 7.4 fut, de akad meg 7.0/7.2 is par helyen

Szerkesztve: 2023. 09. 01., p – 18:23

Megszületett az "official" workaround (mármint, az opcache teljes kikapcsolásán kívül):

opcache.optimization_level=0x7FFEBF5F

Időközben Ondřej fel is töltötte az új buildeket, amikben már ez a default.