Förinladdning

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Förinladdning

Från och med PHP 7.4.0 kan PHP konfigureras för att förinladda skript i OPcache när motorn startar. Alla funktioner, klasser, gränssnitt eller traits (men inte konstanter) i dessa filer kommer sedan att vara globalt tillgängliga för alla förfrågningar utan att behöva inkluderas explicit. Detta växlar bekvämlighet och prestanda (eftersom koden alltid är tillgänglig) mot baslinjeminneanvändning. Det kräver också en omstart av PHP-processen för att rensa förinladdade skript, vilket innebär att denna funktion endast är praktisk att använda i produktion, inte i en utvecklingsmiljö.

Notera att den optimala balansen mellan prestanda och minne kan variera med applikationen. "Förinladda allt" kan vara den enklaste strategin, men inte nödvändigtvis den bästa strategin. Dessutom är förinladdning endast användbart när det finns en persistent process från en förfrågan till en annan. Det betyder att medan det kan fungera i ett CLI-skript om OPcache är aktiverat, är det generellt meningslöst. Undantaget är när förinladdning används på FFI-bibliotek.

Notera: Förinladdning stöds inte på Windows.

Konfigurering av förinladdning involverar två steg och kräver att OPcache är aktiverat. Först, sätt värdet `opcache.preload` i `php.ini`:

opcache.preload=preload.php

`preload.php` är en godtycklig fil som kommer att köras en gång vid serverstart (PHP-FPM, mod_php, etc.) och ladda kod i persistent minne. På servrar som startar som root innan de byter till en oprivilegierad systemanvändare, eller om PHP kommer att köras som root (inte rekommenderat), kan värdet `opcache.preload_user` specificera systemanvändaren som kör förinladdningen. Att köra förinladdning som root är inte tillåtet som standard. Sätt `opcache.preload_user=root` för att explicit tillåta det.

I `preload.php`-skriptet kommer alla filer som refereras via `include`, `include_once`, `require`, `require_once`, eller `opcache_compile_file()` att parsas in i persistent minne. I följande exempel kommer alla .php-filer i `src`-katalogen att förinladdas, om de inte är en Test-fil.

<?php
$directory = new RecursiveDirectoryIterator(__DIR__ . '/src');
$fullTree = new RecursiveIteratorIterator($directory);
$phpFiles = new RegexIterator($fullTree, '/.+((?<!Test)+\.php$)/i', RecursiveRegexIterator::GET_MATCH);

foreach ($phpFiles as $key => $file) {
    require_once $file[0];
}
?>

Både `include` och `opcache_compile_file()` kommer att fungera, men har olika konsekvenser för hur koden hanteras.

  • `include` kommer att köra koden i filen, medan `opcache_compile_file()` inte gör det. Det innebär att det förra stöder villkorsdeklaration (funktioner deklarerade inuti en if-block).
  • Eftersom `include` kommer att köra koden, kommer inbäddade inkluderade filer också att parsas och deras deklarationer förinladdas.
  • `opcache_compile_file()` kan ladda filer i vilken ordning som helst. Det vill säga, om `a.php` definierar klass A och `b.php` definierar klass B som ärver A, kan `opcache_compile_file()` ladda dessa två filer i vilken ordning som helst. Vid användning av `include`, måste dock `a.php` inkluderas först.

I båda fallen, om ett senare skript inkluderar en fil som redan har förinladdats, kommer dess innehåll fortfarande att köras, men några symboler den definierar kommer inte att omdefinieras. Användning av `include_once` kommer inte att förhindra att filen inkluderas en andra gång. Det kan vara nödvändigt att ladda en fil igen för att inkludera globala konstanter som definieras i den, eftersom dessa inte hanteras av förinladdning.

Vilken metod som är bättre beror därför på önskat beteende. Med kod som annars skulle använda en autoloader, tillåter `opcache_compile_file()` större flexibilitet. Med kod som annars skulle laddas manuellt, kommer `include` att vara mer robust.

Sidslut

Orginalhemsidan på Engelska :https://www.php.net/manual/en/opcache.preloading.php

PHP Funktioner Funktionsreferens


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp Stockholm som har sponsrat Linux.se med webserver.