Start · Sprachen · PHP · Referenz · opcache_compile_file

opcache_compile_file

Funktion

Kompiliert ein PHP-Skript und speichert es im OPcache, ohne den Skript-Code tatsächlich auszuführen.

seit PHP 5.5.0 Kategorie: misc

Signatur

opcache_compile_file(string $filename): bool

Beschreibung

opcache_compile_file() liest die angegebene PHP-Datei, kompiliert sie in Opcodes und legt das Ergebnis im OPcache ab – ganz ohne den enthaltenen Code auszuführen. Das ist besonders nützlich, um nach einem Deployment den Cache proaktiv aufzuwärmen (Cache Warming), sodass der erste echte Aufruf einer Seite nicht durch den Kompilierungsschritt verlangsamt wird.

Typische Einsatzgebiete sind Deployment-Skripte oder CLI-Befehle, die nach dem Rollout aller Dateien den OPcache befüllen. Frameworks wie Laravel oder Symfony nutzen diesen Ansatz, um beim ersten Request sofort aus dem Cache zu bedienen. Die Funktion arbeitet dabei mit dem gleichen OPcache-Speicher, den auch der Webserver-Prozess verwendet – sofern opcache.enable_cli aktiviert ist oder der Aufruf über den Webserver-Kontext erfolgt.

Zu beachten ist, dass opcache_compile_file() keine PHP-Klassen, Funktionen oder Variablen der aufrufenden Umgebung registriert – der Code wird lediglich kompiliert und gecacht, nicht interpretiert. Syntax-Fehler in der Zieldatei führen dazu, dass false zurückgegeben wird.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Absoluter oder relativer Pfad zur PHP-Datei, die kompiliert und im OPcache abgelegt werden soll.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Datei erfolgreich kompiliert und gecacht wurde. Gibt false zurück, wenn OPcache deaktiviert ist, die Datei nicht gefunden wurde oder einen Syntaxfehler enthält.

Beispiele

Einzelne Datei nach Deployment vorkompilieren

<?php
// Nach einem Deployment eine kritische Datei sofort in den OPcache laden
$file = '/var/www/html/src/App/Kernel.php';

if (function_exists('opcache_compile_file')) {
    $result = opcache_compile_file($file);
    echo $result
        ? "Datei erfolgreich kompiliert und gecacht.\n"
        : "Fehler beim Kompilieren der Datei.\n";
} else {
    echo "OPcache ist nicht verfügbar.\n";
}
Datei erfolgreich kompiliert und gecacht.

Alle PHP-Dateien eines Verzeichnisses vorkompilieren (Cache Warming)

<?php
// Cache-Warming: Alle PHP-Dateien rekursiv vorkompilieren
function warmOpcache(string $directory): void {
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS)
    );

    $success = 0;
    $failed  = 0;

    foreach ($iterator as $file) {
        if ($file->getExtension() !== 'php') {
            continue;
        }
        if (opcache_compile_file($file->getPathname())) {
            $success++;
        } else {
            $failed++;
            echo "Fehler: " . $file->getPathname() . "\n";
        }
    }

    echo "Erfolgreich: {$success}, Fehlgeschlagen: {$failed}\n";
}

warmOpcache('/var/www/html/src');
Erfolgreich: 142, Fehlgeschlagen: 0

// Wichtig · Fallstricke

CLI-Kontext: Beim Aufruf über die CLI muss opcache.enable_cli = 1 in der php.ini gesetzt sein, damit die Funktion tatsächlich in den OPcache schreibt. Andernfalls gibt sie zwar true zurück, befüllt aber nicht den Cache des Webserver-Prozesses.

Shared Memory: OPcache verwendet geteilten Speicher zwischen Prozessen. Ein CLI-Skript und der FPM/Apache-Prozess teilen sich jedoch standardmäßig nicht denselben OPcache. Für echtes Cache-Warming über HTTP empfiehlt sich ein Endpunkt, der opcache_compile_file() im Web-Prozess aufruft oder Tools wie cachetool.

OPcache-Status prüfen: Mit opcache_get_status() lässt sich prüfen, ob eine Datei tatsächlich im Cache liegt.