Können Sie PHP-Code „kompilieren“ und eine binäre Datei hochladen, die nur vom Bytecode-Interpreter ausgeführt wird?

224

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?

Carson Myers
quelle
Eine verwandte Frage: PHP-Compiler für Windows
Palec
3
Bitte kennzeichnen Sie dies nicht mit hhvm oder hiphop . HHVM ist kein fester Bestandteil der Frage, sondern nur eine mögliche Antwort. meta.stackexchange.com/a/149347/238706
Palec
@HalayemAnis Ich denke, Sie haben einen falschen Link erwähnt. Können Sie den richtigen Link für dieses Tutorial angeben? oder irgendwelche neuesten Update Jungs?
CJ Ramki
@CJRamki Entschuldigung, bitte benutzen Sie diesen Link COMPILE_PHP
Halayem Anis
Diese Frage ist eigentlich eher vage. Sie können "einfach" einen PHP-Compiler erstellen, der (in seiner vollen Bedeutung) Ihren Quellcode und einen PHP-Interpreter in eine ELF, EXE oder was auch immer kompiliert .
Sebastian Mach

Antworten:

234

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 compilereine Reihe von Lösungen von Drittanbietern.

Pfirsichkuchen

  • PeachPie GitHub
  • Kompiliert PHP zu .NET und .NET Core
  • kann in eine in sich geschlossene Binärdatei kompiliert werden
  • läuft auf Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

  • GitHub (Download), Wikipedia
  • Kompilierungen nach .NET (CIL) werden ab Juli 2017 eingestellt und scheinen PHP 7 nicht zu unterstützen.

phc

  • Kompiliert in native Binärdateien
  • jetzt nicht sehr aktiv (Februar 2014) - letzte Version im Jahr 2011, letzte Änderung im Sommer 2013

Roadsend PHP Compiler

bcompiler

  • PECL-Erweiterung von PHP
  • Experimental-
  • Kompiliert zu PHP-Bytecode, kann ihn jedoch in eine Windows-Binärdatei einbinden, die den PHP-Interpreter lädt (siehe bcompiler_write_exe_footer()Handbuch ).
  • sieht jetzt eingestellt aus (Februar 2014) - letzte Änderung im Jahr 2011

Projekt Null

  • Wikipedia , IBM
  • Inkubator für Änderungen für WebSphere sMash
  • von IBM unterstützt
  • Kompiliert zu Java-Bytecode
  • sieht jetzt eingestellt aus (Februar 2014) - Website nicht verfügbar, sieht nach großem Hype in den Jahren 2008 und 2009 aus

Bambalam

  • Kompiliert zu eigenständigen Windows-Binärdateien
  • Die Binärdateien enthalten Bytecode und einen Launcher
  • sieht jetzt eingestellt aus (Februar 2014) - letzte Änderung im Jahr 2006

BinaryPHP

  • Kompiliert nach C ++
  • sieht jetzt eingestellt aus (Februar 2014) - letzte Änderung im Jahr 2003
Frank Farmer
quelle
Was ist mit Shared Web Host? Könnte ich mein PHP-Skript mit einem dieser Compiler kompilieren und dann auf meinen Linux-basierten Webhost hochladen?
SaidbakR
2
@ sємsєм es hängt von Ihrem Gastgeber ab, aber wenn ich raten müsste, würde ich vermuten, dass viele Gastgeber es nicht zulassen würden.
Frank Farmer
2
Keines der oben genannten Projekte scheint mehr gepflegt zu werden. Gibt es seit den letzten 2 Jahren einen allgemein anerkannten Compiler oder warum werden all diese Projekte ignoriert / aufgegeben?
Preexo
Eine schöne Liste von PHP-Compilern finden Sie auf thefreecountry.com. Alle dort genannten Tools sind jetzt in dieser Antwort enthalten.
Palec
1
Da diese alle tot zu sein scheinen, scheint die Antwort "nein" zu sein.
Ira Baxter
22

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.

Zombat
quelle
3
Es ist häufig der Fall, dass Sie einen Interpreter benötigen, um PHP-Programme ordnungsgemäß auszuführen. Dies bedeutet jedoch nicht, dass ein Compiler ihn nicht im kompilierten Code bereitstellen kann. phc (phpcompiler.org) behandelt alle von Ihnen beschriebenen Probleme. Nach meinem besten Wissen tut dies auch Roadsend (roadendend.com).
Paul Biggar
28
Diese Antwort ist veraltet - HipHop wurde 6 Monate nach seiner Veröffentlichung im Februar 2010 veröffentlicht.
Frank Farmer
1
@FrankFarmer Hast du irgendwelche Erfahrungen mit HipHop gemacht? Funktioniert HipHop richtig mit includeund require? Wenn beispielsweise normalerweise ein PHP-Skript enthalten ist, include( 'controller/' . $controller_name . '.php' )funktioniert dies automatisch mit HipHop? Prost
Lea Hayes
2
Tatsächlich können Sie PHP-Code mit normalen PHP-Compilern kompilieren. Es kommt nur auf die Zielplattform an. Sie können in Zend Opcode, C-Sprache oder in .NET-Assemblys kompilieren (mit Phalanger php-compiler.net )
Jakub Míšek
1
The 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.
Synetech
16

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

Alex C.
quelle
3
Dies ist, was Facebook verwendet, glaube ich
Richard H
Die "Art von" liegt nun ein paar Jahre zurück und da HHVM (HipHop Php) von Tag zu Tag besser wird, gibt es endlich einen Weg (glaube ich). Mit HHVM ist es heutzutage möglich, pre-analyzeden 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.
PKeidel
@Andrea, was meinst du damit, dass HHVM veraltet ist? Es sieht als Projekt gepflegt und lebendig aus. Oder meinst du, dass der Name von Hip Hop für PHP in HHVM geändert wurde? Dann ist es irreführend, über Abwertung zu sprechen.
Palec
1
@Palec HipHop für PHP wurde eingestellt. Es war ein PHP-zu-C ++ - Compiler, den Facebook verwendete, der jedoch unhandliche Ausgaben (Binärdateien mit mehreren GB) erzeugte und nicht die vollständige Sprache unterstützen konnte. HHVM ist ein Nachfolgeprojekt, das denselben Code verwendet, jedoch kein Compiler ist. HHVM ist eine virtuelle Maschine. Facebook unterstützt HipHop nicht mehr.
Andrea
11

Es gibt auch

was darauf zielt

  • So codieren Sie das gesamte Skript in einer proprietären PHP-Anwendung
  • Codierung einiger Klassen und / oder Funktionen in einer proprietären PHP-Anwendung
  • Um die Produktion von php-gtk-Anwendungen zu ermöglichen, die auf Client-Desktops verwendet werden können, ohne dass eine php.exe erforderlich ist.
  • Durchführung der Machbarkeitsstudie für einen PHP-C-Konverter

Die Erweiterung ist bei PECL erhältlich.

Gordon
quelle
8

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 evals, includes und die gesamte PHP-Standardbibliothek unterstützt werden.

Paul Biggar
quelle
8

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 .

Asiby
quelle
7

Ähm, jeder hat von Zend Guard gehört , der genau das tut, was diese Person verlangt. Es codiert / verschleiert PHP-Code in "Maschinencode".

John Dillick
quelle
1
Ich glaube nicht, dass sie eine Verschleierung wollten, sondern vielmehr die Beschleunigung, die sich aus der Interferenz von Bytecode und nicht aus der Quelle ergibt.
Stephen
@Stephen Zend Guard soll das auch tun.
Gajus
Zend Guard hat beschlossen, PHP 7 nicht zu unterstützen, was ein Nachteil ist - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj
2

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.

Jakub Míšek
quelle
1

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.

caiofior
quelle
"In PHP 7" ist es nicht nur PHP7, es ist PHP 5.5.0 und höher
Raymond Nijland
0

PHP wird nicht wirklich kompiliert wie bei vielen Programmen. Sie können den Encoder von Zend verwenden, um ihn unlesbar zu machen.

Joe
quelle
Wird es nicht auf die gleiche Weise kompiliert wie Perl?
Carson Myers
Ich glaube, PHP wird im laufenden Betrieb auf dem Server kompiliert. Ich habe jedoch einen Encoder verwendet, um den Quellcode auszublenden. Wenn Sie sich darüber Sorgen machen. Sie arbeiten wirklich gut.
Joe
Nein, ich war nur an dem theoretischen Aspekt interessiert
Carson Myers
2
PHP wird nicht eingehalten, es ist eine interpretierte Sprache. der Cache enthält ‚Opcodes‘ Whitch PHP interpretiert (nicht zu lesenden Text mit), PHP - Code kann nicht sein ‚run‘ direkt wie bei c
borrel
0

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 ( clangund 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 installierter clangCompiler.

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

Mecki
quelle