Start · Sprachen · PHP · Referenz · __halt_compiler

__halt_compiler

Funktion

Stoppt den PHP-Compiler an der aktuellen Position in der Datei und behandelt den Rest der Datei als rohe Daten.

seit PHP 5.1.0 Kategorie: misc

Signatur

__halt_compiler(): void

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

Typ
void
Beschreibung
Kein Rückgabewert. Das Konstrukt hat keine Auswirkung zur Laufzeit — es wirkt ausschließlich während der Kompilierung.

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.
Eingebettete Daten: 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.
PHP-Skript endet bei Byte: 254 Nutzdaten-Größe: 47 Byte

// 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.