Czy można „skompilować” kod PHP i załadować plik binarny, który zostanie po prostu uruchomiony przez interpreter kodu bajtowego?

224

Wiem, że PHP jest kompilowane do kodu bajtowego przed uruchomieniem na serwerze, a następnie ten bajtowy kod może być buforowany, aby cały skrypt nie musiał być ponownie interpretowany przy każdym dostępie do sieci.

Ale czy możesz „skompilować” kod PHP i załadować plik binarny, który zostanie po prostu uruchomiony przez interpreter kodu bajtowego?

Carson Myers
źródło
Powiązane pytanie: kompilator PHP dla Windows
Palec
3
Nie oznaczaj tego tagiem hhvm ani hiphop . HHVM nie jest nieodłączną częścią pytania, a jedynie możliwą odpowiedzią. meta.stackexchange.com/a/149347/238706
Palec
@HalayemAnis Myślę, że wspomniano o niewłaściwym łączu .. Czy możesz podać poprawny link do tego samouczka? lub jakieś najnowsze aktualizacje chłopaki?
CJ Ramki,
@CJRamki przepraszam, użyj tego linku COMPILE_PHP
Halayem Anis
To pytanie jest właściwie dość niejasne. Możesz „po prostu” zbudować kompilator PHP, który kompiluje (w pełnym tego słowa znaczeniu) swój kod źródłowy i interpreter PHP w plik ELF, EXE lub cokolwiek innego.
Sebastian Mach

Odpowiedzi:

234

Po zadaniu tego pytania Facebook uruchomił HipHop dla PHP, który jest prawdopodobnie najlepiej przetestowanym kompilatorem PHP do tej pory (ponieważ jest obsługiwany przez jedną z 10 największych stron internetowych na świecie). Jednak Facebook przerwał na rzecz HHVM, który jest maszyną wirtualną, a nie kompilatorem.

Poza tym googling PHP compileroferuje szereg rozwiązań innych firm.

Ciasto brzoskwiniowe

  • PeachPie GitHub
  • kompiluje PHP do .NET i .NET Core
  • może zostać skompilowany w samodzielny plik binarny
  • działa na komputerach Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

  • GitHub (pobierz), Wikipedia
  • kompilacja do .NET (CIL) wygląda na nieaktualną od lipca 2017 r. i nie obsługuje PHP 7.

phc

  • kompiluje się do natywnych plików binarnych
  • obecnie mało aktywna (luty 2014 r.) - ostatnia wersja w 2011 r., ostatnia zmiana latem 2013 r

Roadsend PHP Compiler

bcompiler

  • Rozszerzenie PECL PHP
  • eksperymentalny
  • kompiluje się do kodu bajtowego PHP, ale może owinąć go w plik binarny Windows, który ładuje interpreter PHP (patrz bcompiler_write_exe_footer()instrukcja )
  • wygląda na wycofany teraz (luty 2014 r.) - ostatnia zmiana w 2011 r

Project Zero

  • Wikipedia , IBM
  • inkubator zmian dla WebSphere sMash
  • obsługiwany przez IBM
  • kompiluje się do kodu bajtowego Java
  • wygląda na to, że jest już zaniechany (luty 2014 r.) - strona internetowa nie działa, wygląda na dużą popularność w 2008 i 2009 roku

Bambalam

  • kompiluje się do autonomicznych plików binarnych Windows
  • pliki binarne zawierają kod bajtowy i program uruchamiający
  • wygląda na wycofany teraz (luty 2014 r.) - ostatnia zmiana w 2006 r

BinaryPHP

  • kompiluje się do C ++
  • wygląda na wycofany teraz (luty 2014 r.) - ostatnia zmiana w 2003 r
Frank Farmer
źródło
Co z udostępnionym hostem internetowym? Czy mogę skompilować skrypt PHP za pomocą jednego z tych kompilatorów, a następnie przesłać go do mojego hosta opartego na systemie Linux?
SaidbakR
2
@ sємsєм to zależy od twojego hosta, ale gdybym musiał zgadywać, zgaduję, że wielu hostów na to nie pozwoli.
Frank Farmer
2
Żaden z powyższych projektów nie wydaje się już utrzymany. Czy istnieje powszechnie akceptowany kompilator od ostatnich 2 lat lub dlaczego wszystkie te projekty są pomijane / porzucane?
Preexo
Lista miłe z kompilatorów PHP jest thefreecountry.com. Wszystkie wymienione tam narzędzia są teraz zawarte w tej odpowiedzi.
Palec
1
Ponieważ wszystkie wydają się martwe, odpowiedź wydaje się „nie”.
Ira Baxter,
22

Krótka odpowiedź brzmi „nie”.

Obecną implementacją PHP jest język interpretowany. Można argumentować teoretyczne aspekty faktu, że każdy język może być technicznie interpretowany lub kompilowany, ale w obecnej postaci obecne implementacje są takie, że kod PHP wymaga do działania tłumacza, a tłumacz zarządza środowiskiem wykonawczym.

Aby odpowiedzieć na pytanie dotyczące przesyłania skompilowanego kodu bajtowego PHP, jest to prawdopodobnie możliwe, ale trzeba by zaimplementować sposób, w jaki interpreter PHP może czytać taki plik i pracować z nim. Przy istniejących już buforach opcode nie wydaje się to zadaniem, które przyniosłoby wiele korzyści.

zombat
źródło
3
Często zdarza się, że potrzebujesz interpretera do poprawnego uruchamiania programów PHP, ale to nie znaczy, że kompilator nie może zapewnić go w skompilowanym kodzie. phc (phpcompiler.org) obsługuje wszystkie opisane problemy. O ile mi wiadomo, Roadsend (roadsend.com) też.
Paul Biggar,
28
Ta odpowiedź jest nieaktualna - HipHop został wydany 6 miesięcy po opublikowaniu, w lutym 2010 roku.
Frank Farmer
1
@FrankFarmer Czy miałeś jakieś doświadczenie z HipHop? Czy HipHop działa poprawnie z includei require? Na przykład, jeśli zwykle dołączany jest skrypt PHP, include( 'controller/' . $controller_name . '.php' )czy to automatycznie działa z HipHop? na zdrowie
Lea Hayes,
2
W rzeczywistości możesz skompilować kod PHP, używając zwykłych kompilatorów PHP. To zależy tylko od platformy docelowej; możesz skompilować do kodu Zend, języka C lub do zestawów .NET (używając 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…Nie ma w tym nic teoretycznego, wiele interpretowanych języków ma kompilatory; mianowicie AutoIt / AutoHotkey, a nawet tak daleko jak BASIC. Istnieje wiele programów, które zostały w nich napisane, a następnie skompilowane do użytku publicznego jako samodzielne programy. W PHP nie ma nic specjalnego, co uniemożliwiałoby jego kompilację, dlatego istnieje wiele kompilatorów, ale w przeciwieństwie do AHK, nie ma oficjalnego, przetestowanego kompilatora - Zend Guard nie bardzo się liczy.
Synetech,
16

Od czasu, gdy pytanie zostało zadane po raz pierwszy, nastąpiła zmiana tej odpowiedzi z prostego „nie” na „rodzaj”

http://github.com/facebook/hiphop-php/wiki

Hip Hop dla PHP był kompilatorem, który wziął kod PHP i przekształcił go w wysoce zoptymalizowany C ++ Najwyraźniej niektóre funkcje nie są obsługiwane (na przykład „eksploduj”)

Znalazłem to pytanie, szukając więcej informacji na temat implementacji HipHop i pomyślałem, że się odezwę :)

Jednak od 2013 r. Facebook już z niego nie korzysta i został wycofany na rzecz HHVM, który nie jest kompilatorem: https://en.wikipedia.org/wiki/HipHop_for_PHP

Alex C.
źródło
3
wierzę, że tego używa Facebook
Richard H
„Rodzaj” leży teraz kilka lat wstecz, a ponieważ HHVM (HipHop Php) z każdym dniem staje się coraz lepszy, ostatecznie istnieje sposób (tak myślę). Korzystanie z HHVM jest obecnie możliwe do pre-analyzekodu php. W rezultacie otrzymujesz plik Binary-Cache. Dzięki temu plikowi i poprawnej konfiguracji HHVM można uruchomić stronę internetową tylko z kodem bajtowym, nie trzeba już plików źródłowych;) <br> Mam nadzieję, że dobrze to zrobiłem.
PKeidel,
@Andrea, co masz na myśli mówiąc, że HHVM jest przestarzałe? Wygląda na utrzymany i żywy jako projekt. Czy może masz na myśli zmianę nazwy z Hip Hop na PHP na HHVM? Zatem mówienie o rezygnacji jest mylące.
Palec
1
@Palec HipHop dla PHP został wycofany. Był to kompilator PHP na C ++, którego używał Facebook, ale generował nieporęczne wyjście (pliki binarne o rozmiarze wielu GB) i nie mógł obsługiwać pełnego języka. HHVM jest następcą projektu, który dzieli część tego samego kodu, ale nie jest kompilatorem. HHVM to maszyna wirtualna. Facebook nie obsługuje już HipHop.
Andrea
11

Jest również

Który ma na celu

  • Aby zakodować cały skrypt w zastrzeżonej aplikacji PHP
  • Do zakodowania niektórych klas i / lub funkcji w zastrzeżonej aplikacji PHP
  • Aby umożliwić produkcję aplikacji php-gtk, które mogłyby być używane na komputerach klienckich, bez potrzeby instalowania php.exe.
  • Aby wykonać studium wykonalności dla konwertera PHP na C.

Rozszerzenie jest dostępne w PECL.

Gordon
źródło
8

phc pozwala kompilować programy PHP we współdzielone biblioteki, które można przesłać na serwer. Program PHP jest skompilowany do plików binarnych. Odbywa się to w taki sposób, aby obsługiwać evals, includes i całą standardową bibliotekę PHP.

Paul Biggar
źródło
8

Jeśli po prostu szukasz binarnego pliku wykonywalnego ze skryptu PHP, unikaj sprecyzowania pytania, ponieważ sprawi, że będziesz wiedział, czego dokładnie potrzebujesz. Poza tym większość programistów PHP absolutnie nie ma pojęcia, co to jest kod bajtowy.

Powiedziawszy to, odpowiedź brzmi TAK . Właśnie skończyłem kompilować skrypt PHP w plik binarny. I to nie tylko binarne. Korzystałem z aplikacji CDE (link do Wayback Machine, oryginalny link jest teraz zepsuty), aby przekształcić ją w przenośny plik binarny, który można dystrybuować ze wszystkimi zależnościami i uruchamiać bez żadnych problemów… i działa pięknie.

Wszystko czego potrzebujesz to użyć phc .

asiby
źródło
7

Um, ktoś słyszał o Zend Guard , który robi dokładnie to, o co prosi ta osoba. Koduje / zaciemnia kod PHP do „kodu maszynowego”.

John Dillick
źródło
1
Nie sądzę, by chcieli zaciemnienia tak bardzo, jak przyspieszenia wynikające z ingerowania kodu bajtowego zamiast źródła.
Stephen
@ Stephen Zend Guard też ma to zrobić.
Gajus
Zend Guard postanowił nie obsługiwać PHP 7, co jest wadą - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj
2

Istnieje kilka „kompilatorów” kodu PHP. Większość z nich nie obsługuje wszystkich funkcji PHP, ponieważ należy je po prostu interpretować w czasie wykonywania.

Używamy Phalanger - http://www.php-compiler.net/ - który obsługuje nawet te brudne dynamiczne funkcje PHP i nadal jest w stanie skompilować je jako zestaw .NET, który może być dystrybuowany jako samodzielna biblioteka DLL.

Jakub Míšek
źródło
1

W php 7 dostępna jest opcja php ini opcache.file_cache która zapisuje kod bajtowy w określonym folderze. Może być przydatne w skrypcie php cli, które są „kompilowane” i zapisywane w określonym folderze w celu zoptymalizowanego ponownego wykorzystania.

Opcache nie kompiluje się, ale jest podobny.

kaiofior
źródło
„W php 7” to nie tylko PHP7, to PHP 5.5.0 i nowsze wersje
Raymond Nijland
0

PHP tak naprawdę nie jest kompilowany jak w przypadku wielu programów. Możesz jednak użyć kodera Zend, aby uczynić go nieczytelnym.

Joe
źródło
czy nie jest kompilowany w taki sam sposób, jak perl jest kompilowany?
Carson Myers,
Wierzę, że PHP jest kompilowane na serwerze w locie. Użyłem enkodera, aby ukryć kod źródłowy. Jeśli o to się martwisz. Działają naprawdę dobrze.
Joe
nie, interesowałem się tylko teoretycznym aspektem
Carson Myers,
2
PHP nie jest przestrzegane, jest to język interpretowany. pamięć podręczna zawiera „opcodes”, które interpretuje php (nie musi czytać tekstu), kodu php nie można „uruchomić” bezpośrednio, tak jak w przypadku c
borrel
0

Jeśli możesz uruchamiać prawdziwe natywne pliki binarne, to jest to twój kompilator:

https://github.com/ircmaxell/php-compiler

To kompilator PHP napisany w PHP!

Kompiluje kod PHP do własnego kodu VM. Ten kod maszyny wirtualnej może być następnie zinterpretowany przez własnego tłumacza (również napisany w PHP, prawda?) Lub może zostać przetłumaczony na kod bitowy. Za pomocą frameworka kompilatora LLVM ( clangi co) ten kod bitowy można skompilować w natywny plik binarny dla dowolnej platformy obsługiwanej przez LLVM (właściwie każdej platformy, która ma dziś znaczenie). Możesz to zrobić statycznie lub za każdym razem tuż przed wykonaniem kodu (styl JIT). Tak więc jedyne dwa wymagania, aby ten kompilator działał w twoim systemie, to zainstalowany interpreter PHP i zainstalowany clangkompilator.

Jeśli nie możesz uruchamiać natywnych plików binarnych, możesz użyć powyższego kompilatora jako interpretera i pozwolić mu interpretować własny kod maszyny wirtualnej, ale będzie to wolniejsze, ponieważ korzystasz z interpretera PHP, który sam działa na silniku PHP, więc masz „podwójną interpretację”.

Mecki
źródło