Signatur
Beschreibung
__halt_compiler() ist ein Sprachkonstrukt, das die PHP-Kompilierung an der Stelle seines Auftretens unterbricht. Alles, was nach dem schließenden ; des Konstrukts steht, wird vom PHP-Parser nicht mehr ausgewertet, sondern als roher Datenstrom behandelt.
Das Hauptanwendungsgebiet ist die Erstellung von selbstentpackenden Archiven oder Installer-Skripten: Man hängt beliebige Binär- oder Textdaten (z. B. komprimierte Archive, Zertifikate oder Manifests) direkt an eine PHP-Datei an. Zur Laufzeit kann der PHP-Code diese Daten über die Konstante __COMPILER_HALT_OFFSET__ und fseek() / fread() effizient lesen, ohne eine separate Datei mitliefern zu müssen.
Die automatisch definierte Konstante __COMPILER_HALT_OFFSET__ enthält den Byte-Offset ab dem Dateianfang, an dem die eingebetteten Daten beginnen. So lässt sich die aktuelle Datei selbst öffnen, direkt zu dieser Position springen und die Nutzdaten auslesen.
__halt_compiler() darf nur im globalen Scope (nicht innerhalb von Funktionen, Klassen oder Namespaces) eingesetzt werden, da es einen Parse-Fehler auslöst, wenn es in einem verschachtelten Kontext steht.
Rückgabewert
Beispiele
Eingebettete Daten aus der eigenen PHP-Datei lesen
<?php
// Byte-Offset zum eingebetteten Datenstrom
$offset = __COMPILER_HALT_OFFSET__;
$fh = fopen(__FILE__, 'rb');
fseek($fh, $offset);
$data = stream_get_contents($fh);
fclose($fh);
echo "Eingebettete Daten:\n";
echo $data;
__halt_compiler();
Dies sind eingebettete Rohdaten, die der PHP-Parser ignoriert.
Hier könnte ein ZIP-Archiv oder ein anderes Binärformat folgen.
Einfacher Selbsttest: Länge der eingebetteten Nutzdaten bestimmen
<?php
$offset = __COMPILER_HALT_OFFSET__;
$totalSize = filesize(__FILE__);
$payloadSize = $totalSize - $offset;
echo "PHP-Skript endet bei Byte: {$offset}\n";
echo "Nutzdaten-Größe: {$payloadSize} Byte\n";
__halt_compiler();
Nutzdaten-Block: Hier stehen genau 47 Zeichen.
// Wichtig · Fallstricke
Einschränkungen: __halt_compiler() darf ausschließlich im globalen Gültigkeitsbereich stehen. Innerhalb von Funktionen, Methoden, Klassen oder Namespaces führt es zu einem Fatal Parse Error.
Bekannte Verwendung: Das PHAR-Format sowie Installer-Tools wie Box nutzen dieses Konstrukt intern. Wer eigene selbstentpackende Pakete baut, sollte jedoch moderne Alternativen wie das eingebaute PHAR-Format in Betracht ziehen, da dieses Signaturprüfung und Integritätsschutz mitbringt.
Portabilität: Da nach __halt_compiler() beliebige Bytes folgen können (inkl. Nullbytes), eignet sich das Konstrukt auch für Binärdaten. Beim Lesen muss fopen() unbedingt im Binärmodus ('rb') geöffnet werden, um plattformspezifische Zeilenumbruch-Konvertierungen zu vermeiden.