Ich weiß, dass PHP zu Bytecode kompiliert wird, bevor es auf dem Server ausgeführt wird, und dass dann Bytecode zwischengespeichert werden kann, damit das gesamte Skript nicht bei jedem Webzugriff neu interpretiert werden muss.
Aber können Sie PHP-Code "kompilieren" und eine binäre Datei hochladen, die nur vom Bytecode-Interpreter ausgeführt wird?
Antworten:
Nachdem diese Frage gestellt wurde, startete Facebook HipHop für PHP, den wahrscheinlich am besten getesteten PHP-Compiler bis heute (da er eine der 10 größten Websites der Welt betrieb). Facebook hat es jedoch zugunsten von HHVM eingestellt, einer virtuellen Maschine, die kein Compiler ist.
Darüber hinaus bietet Googeln
PHP compiler
eine Reihe von Lösungen von Drittanbietern.Pfirsichkuchen
Phalanger
phc
Roadsend PHP Compiler
bcompiler
bcompiler_write_exe_footer()
Handbuch ).Projekt Null
Bambalam
BinaryPHP
quelle
Die kurze Antwort lautet "nein".
Die aktuelle Implementierung von PHP ist die einer interpretierten Sprache. Sie können die theoretischen Aspekte der Tatsache argumentieren, dass jede Sprache technisch interpretiert oder kompiliert werden kann. Derzeit sind die aktuellen Implementierungen jedoch so, dass für die Ausführung von PHP-Code ein Interpreter erforderlich ist und der Interpreter die Ausführungsumgebung verwaltet.
Um Ihre Frage zum Hochladen von vorkompiliertem PHP-Bytecode zu beantworten, ist es wahrscheinlich möglich, aber Sie müssten eine Möglichkeit implementieren, damit der PHP-Interpreter eine solche Datei einliest und damit arbeitet. Da es bereits vorhandene Opcode-Caches gibt, scheint dies keine Aufgabe zu sein, die viel Belohnung bringen würde.
quelle
include
undrequire
? Wenn beispielsweise normalerweise ein PHP-Skript enthalten ist,include( 'controller/' . $controller_name . '.php' )
funktioniert dies automatisch mit HipHop? ProstThe short answer is "no". The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects…
Es gibt nichts Theoretisches, viele interpretierte Sprachen haben Compiler; nämlich AutoIt / AutoHotkey oder sogar bis zu BASIC. Es gibt viele Programme, die in diesen geschrieben und dann für die Öffentlichkeit als eigenständige Programme zusammengestellt wurden. Es gibt nichts Besonderes an PHP, das verhindert, dass es kompilierbar ist, weshalb es eine Reihe von Compilern gibt, aber im Gegensatz zu AHK gibt es keinen offiziellen, getesteten Compiler - Zend Guard zählt nicht ganz.Seit die Frage zum ersten Mal gestellt wurde, hat sich diese Antwort von einem "Nein" zu einer "Art" geändert.
http://github.com/facebook/hiphop-php/wiki
Hip Hop für PHP war ein Compiler, der PHP-Code in hochoptimiertes C ++ umwandelte. Anscheinend werden einige Funktionen nicht unterstützt (zum Beispiel 'explodieren').
Ich habe diese Frage gefunden, als ich nach weiteren Informationen zur Implementierung von HipHop gesucht habe und dachte, ich würde mich melden :)
Seit 2013 nutzt Facebook es jedoch nicht mehr und es wurde zugunsten von HHVM eingestellt, das kein Compiler ist: https://en.wikipedia.org/wiki/HipHop_for_PHP
quelle
pre-analyze
den PHP-Code zu verwenden. Als Ergebnis erhalten Sie eine Binary-Cache-Datei. Mit dieser Datei und der richtigen HHVM-Konfiguration ist es möglich, eine Webseite nur mit Bytecode auszuführen, ohne dass die Quelldateien mehr benötigt werden;) <br> Ich hoffe, ich habe es richtig gemacht.Es gibt auch
was darauf zielt
Die Erweiterung ist bei PECL erhältlich.
quelle
Mit phc können Sie PHP-Programme in gemeinsam genutzte Bibliotheken kompilieren, die auf den Server hochgeladen werden können. Das PHP-Programm wird in Binärdateien kompiliert. Dies geschieht so, dass
eval
s,include
s und die gesamte PHP-Standardbibliothek unterstützt werden.quelle
Wenn Sie einfach nur eine ausführbare Binärdatei aus einem PHP-Skript erstellen möchten, vermeiden Sie es bitte, Ihre Frage äußerst präzise zu stellen, da Sie den Eindruck haben, dass Sie genau wissen, was Sie benötigen. Außerdem haben die meisten PHP-Entwickler absolut keine Ahnung, was ein Bytecode ist.
Nachdem dies gesagt wurde, lautet die Antwort JA . Ich habe gerade ein PHP-Skript in eine Binärdatei kompiliert. Und nicht irgendeine Binärdatei. Ich habe die CDE-Anwendung verwendet (Link zu Wayback Machine, der ursprüngliche Link ist jetzt unterbrochen), um daraus eine tragbare Binärdatei zu machen, die mit allen Abhängigkeiten verteilt und ohne Probleme ausgeführt werden kann… und sie funktioniert wunderbar.
Alles was Sie brauchen, ist PHC zu verwenden .
quelle
Ähm, jeder hat von Zend Guard gehört , der genau das tut, was diese Person verlangt. Es codiert / verschleiert PHP-Code in "Maschinencode".
quelle
Es gibt mehrere "Compiler" von PHP-Code. Die meisten von ihnen unterstützen nicht alle PHP-Funktionen, da diese einfach zur Laufzeit interpretiert werden müssen.
Wir verwenden Phalanger - http://www.php-compiler.net/ -, das selbst diese schmutzigen dynamischen PHP-Funktionen unterstützt und sie dennoch als .NET-Assembly kompilieren kann, die als eigenständige DLL verteilt werden kann.
quelle
siehe 5.5.x mit dem integrierten OPcache-Modul, das in einem gemeinsam genutzten Speicher flüchtig ist, viel mehr Leistung und das Dynamikprinzip von PHP bleiben unberührt.
http://www.php.net/manual/en/opcache.installation.php
quelle
In PHP 7 gibt es die PHP- INI- Option opcache.file_cache , die den Bytecode in einem bestimmten Ordner speichert. In könnte nützlich sein, um in PHP-CLI-Skripten, die "kompiliert" und in einem bestimmten Ordner für eine optimierte Wiederverwendung gespeichert werden.
Opcache wird nicht kompiliert, ist aber ähnlich.
quelle
PHP wird nicht wirklich kompiliert wie bei vielen Programmen. Sie können den Encoder von Zend verwenden, um ihn unlesbar zu machen.
quelle
Wenn Sie echte native Binärdateien ausführen dürfen, ist dies Ihr Compiler:
https://github.com/ircmaxell/php-compiler
Es ist ein in PHP geschriebener PHP-Compiler !
Es kompiliert PHP-Code zu seinem eigenen VM-Code. Dieser VM-Code kann dann entweder von einem eigenen Interpreter interpretiert werden (ebenfalls in PHP geschrieben, ist das nicht verrückt?) Oder er kann in Bitcode übersetzt werden. Mit dem LLVM-Compiler-Framework (
clang
und Co) kann dieser Bitcode für jede Plattform, die LLVM unterstützt, in eine native Binärdatei kompiliert werden (so ziemlich jede Plattform, die heute wichtig ist). Sie können dies entweder statisch oder jedes Mal kurz vor der Ausführung des Codes (JIT-Stil) auswählen. Die einzigen zwei Voraussetzungen, damit dieser Compiler auf Ihrem System funktioniert, sind ein installierter PHP-Interpreter und ein installierterclang
Compiler.Wenn Sie keine nativen Binärdateien ausführen dürfen, können Sie den oben genannten Compiler als Interpreter verwenden und seinen eigenen VM-Code interpretieren lassen. Dies ist jedoch langsam, da Sie einen PHP-Interpreter ausführen, der selbst auf einer PHP-Engine ausgeführt wird Sie haben eine "doppelte Interpretation".
quelle