25.5 bcompiler 

Besprochene Version: 0.6 | Lizenz: PHP-Lizenz 2.02 |
bcompiler ist eine sehr interessante Erweiterung. Dieser Bytecode-Compiler ist in der Lage, PHP-Code in einen so genannten Bytecode zu übersetzen. Dieser Bytecode ist eine Art Zwischenstadium. Das heißt, es handelt sich nicht mehr um PHP, aber auch noch nicht um reinen Maschinencode. Dieser Code leistet exakt dasselbe wie der ursprüngliche PHP-Code, kann aber nicht mehr ohne Probleme entziffert werden. Das hat den Vorteil, dass niemand mehr Ihre Algorithmen entschlüsseln oder Ihren Code verändern kann. Das ist beispielsweise dann sehr hilfreich, wenn Sie Ihre Programme verkaufen und sichergehen wollen, dass niemand Veränderungen daran vornimmt. Ein anderer Anwendungsfall wäre, dass Sie eventuell eine Testversion eines Programms erstellen wollen, das beispielsweise nur 30 Tage laufen soll. Auch in dem Fall können Sie die Routine zur Zeitmessung im Code belassen, ohne Gefahr zu laufen, dass sie entfernt wird.
Bitte beachten Sie dabei, dass ein solcher Code nicht verschlüsselt ist. Das heißt, dass Funktionsnamen, String-Literale oder Namen von Konstanten im Bytecode nach wie vor zu lesen sind. Daher sollten sicherheitsrelevante Informationen hier nie im Klartext enthalten sein.
Die Nutzung gestaltet sich recht einfach. Nachdem Sie den PHP-Code fertig erstellt haben, können Sie ihn mithilfe von bcompiler übersetzen. Dazu öffnen Sie erst eine neue Datei, in der der Bytecode abgelegt werden soll. Das Datei-Handle, das Sie von fopen() zurückgegeben bekommen, wird dann an die Funktion bcompiler_write_header() übergeben, die einen Header in die Datei schreibt, damit der Bytecode auch korrekt ausgeführt werden kann.
Danach rufen Sie die Funktion bcompiler_write_file() auf, die als ersten Parameter die Datei-Ressource übergeben bekommt. Danach folgt als zweiter Parameter der Name der Quelldatei, die übersetzt werden soll.
Zu guter Letzt rufen Sie noch die Funktion bcompiler_write_footer() auf, die die Bytecode-Datei korrekt schließt.
$fh = fopen('ziel.php', 'w'); if (false == $fh) { die ('Konnte Datei nicht anlegen'); } $res = bcompiler_write_header($fh); if (false == $res) { die ('Konnte Header nicht schreiben'); } $res = bcompiler_write_file($fh, 'quelle.php'); if (false == $res) { die ('Konnte Datei nicht kompilieren'); } $res = bcompiler_write_footer($fh); if (false == $res) { die ('Konnte Datei nicht kompilieren'); } fclose($fh);
Listing 25.6 Nutzung von bcompiler
Die Zieldatei, die geschrieben wird, können Sie nun direkt aufrufen, wobei zu beachten ist, dass auf dem Server, der diese Datei ausführen soll, bcompiler installiert sein muss.
Allerdings müssen Sie nicht immer eine ganze Datei übersetzen lassen. Es ist auch möglich, eine Klasse, eine Konstante oder eine Funktion als Bytecode abzulegen. Zum Speichern von Klassen oder Konstanten nutzen Sie die Funktionen bcompiler_write_class() bzw. bcompiler_write_constant(). Beide bekommen als ersten Parameter das File-Handle und als zweiten den Namen der Klasse bzw. der Konstante übergeben. Dabei gehen die Funktionen davon aus, dass die Daten, die gespeichert werden sollen, im aktuellen Script vorhanden sind. Handelt es sich um eine externe Datei, müssten Sie diese also erst inkludieren.
Das Gleiche gilt für die Funktion bcompiler_write_functions(), die eine Funktion auslagert. In diesem Fall gibt es aber noch zusätzlich die Funktion bcompiler_write_functions_from_file(). Sie bekommt als zweiten Parameter einen Dateinamen übergeben, der eine Datei bezeichnet, die nur Funktionen, also keinen eigenständig lauffähigen Code, enthält.
Um die so erstellten Dateien nutzen zu können, binden Sie sie einfach mit require() oder include() ein. Dabei gilt natürlich, dass der bcompiler auch zum Ausführen der Dateien auf dem Server installiert sein muss.