Czy możesz "skompilować" kod PHP i przesłać plik binarny, który będzie uruchamiany przez interpreter kodu bajtowego?

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

Ale czy możesz "skompilować" kod PHP i przesłać plik binarny, który będzie uruchamiany przez interpreter kodu bajtowego?

 231
Author: Peter Mortensen, 2009-09-11

13 answers

Po zadaniu tego pytania, Facebook uruchomił HipHop dla PHP , który jest prawdopodobnie najlepiej przetestowanym kompilatorem PHP do tej pory(widząc, że prowadził jedną z 10 największych stron na świecie). Jednak Facebook zaprzestał go na rzecz HHVM, który jest maszyną wirtualną, a nie kompilatorem.

Poza tym, googling PHP compiler pojawia się wiele rozwiązań stron trzecich.

PeachPie

  • PeachPie GitHub
  • kompiluje PHP do. NET i. NET Core
  • można skompilować do samodzielnego pliku binarnego
  • Działa na Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

  • GitHub (download), Wikipedia
  • Kompilacja do. NET (CIL) wygląda na przerwaną od lipca 2017 i wydaje się, że nie obsługuje PHP 7.

Phc

  • kompiluje do natywnych binariów
  • nie bardzo aktywny teraz (luty 2014) - Ostatnia wersja w 2011, Ostatnia zmiana latem 2013

Roadsend PHP Compiler

Bcompiler

  • rozszerzenie PECL of PHP
  • eksperymentalne
  • kompiluje do kodu bajtowego PHP, ale może zawijać go w binarny system Windows, który ładuje interpreter PHP (zobacz bcompiler_write_exe_footer() manual )
  • wygląda wycofane teraz (luty 2014) - Ostatnia zmiana w 2011

Projekt Zero

  • Wikipedia, IBM
  • inkubator zmian dla WebSphere sMash
  • obsługiwane przez IBM
  • kompiluje do kodu bajtowego Javy
  • wygląda obecnie (luty 2014) - strona w dół, wygląda jak duży szum w 2008 i 2009

Bambalam

  • kompiluje do samodzielnych binariów Windows
  • pliki binarne zawierają bytecode i launcher
  • wygląda wycofane teraz (luty 2014) - Ostatnia zmiana w 2006

BinaryPHP

  • kompiluje do C++
  • wygląda wycofane teraz (luty 2014) - Ostatnia zmiana w 2003
 240
Author: Frank Farmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-02 13:12:46

Krótka odpowiedź brzmi "nie".

Obecna implementacja PHP to implementacja języka interpretowanego. Można argumentować teoretyczne aspekty faktu, że każdy język może być technicznie interpretowany lub kompilowany, ale w obecnym stanie, obecne implementacje są takie, że kod PHP wymaga interpretera do uruchomienia, a interpreter zarządza środowiskiem wykonującym.

Aby odpowiedzieć na twoje pytanie o przesyłanie wstępnie skompilowanego kodu bajtowego PHP, prawdopodobnie jest to możliwe, ale trzeba zaimplementować sposób na interpreter PHP do odczytu w takim pliku i pracy z nim. Przy istniejących już buforach kodów opcode nie wydaje się to zadaniem, które przyniosłoby wiele korzyści.

 21
Author: zombat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 00:31:33

Odkąd pytanie zostało zadane po raz pierwszy, nastąpiła zmiana tej odpowiedzi z "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 'explode')

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

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

 16
Author: Alex C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 13:24:54

Istnieje również

Które cele

  • aby zakodować cały skrypt we własnej aplikacji PHP
  • aby zakodować niektóre klasy i / lub funkcje w zastrzeżonej aplikacji PHP
  • aby umożliwić produkcję aplikacji php-gtk, które mogą być używane na komputerach klienckich, bez potrzeby stosowania php.exe.
  • aby wykonać studium wykonalności dla konwertera PHP na C

Rozszerzenie jest dostępne w PECL.

 11
Author: Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-18 23:54:02

Phc pozwala na kompilowanie programów PHP do bibliotek współdzielonych, które można przesłać na serwer. Program PHP jest kompilowany do binariów. Odbywa się to w taki sposób, aby obsługiwać evals, include s i całą bibliotekę standardową PHP.

 8
Author: Paul Biggar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-26 14:36:39

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

 8
Author: John Dillick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 15:47:51

Jeśli po prostu szukasz binarnego pliku wykonywalnego ze skryptu PHP, to unikaj prób precyzowania swojego pytania, ponieważ sprawi, że okaże się, że wiesz dokładnie, czego potrzebujesz. Poza tym, większość programistów PHP nie ma absolutnie żadnego pojęcia o tym, czym jest bajt.

Z tym powiedziane, odpowiedź jest tak . Właśnie skończyłem kompilować skrypt PHP do pliku binarnego. I to nie byle co. Korzystałem z aplikacji CDE (link do Wayback Maszyna, oryginalny link jest teraz uszkodzony), aby przekształcić go w przenośny binarny, który może być dystrybuowany ze wszystkimi zależnościami i wykonywany bez żadnego problemu... i działa pięknie.

Wystarczy użyć phc .

 8
Author: asiby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-09 22:04:26

Istnieje kilka "kompilatorów" kodu PHP. Większość z nich nie obsługuje wszystkich funkcji PHP, ponieważ muszą one być interpretowane podczas wykonywania.

Używamy Phalanger- http://www.php-compiler.net/ - to wspiera nawet te brudne funkcje dynamiczne PHP, i nadal jest w stanie skompilować je jako.NET assembly, które mogą być dystrybuowane jako samodzielny DLL.

 2
Author: Jakub Míšek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-11 21:08:42

Patrz 5.5.x ze zintegrowanym modułem OPcache, Lotny w pamięci współdzielonej, znacznie większa wydajność i zasada dynamiki php pozostają nietknięte.

Http://www.php.net/manual/en/opcache.installation.php

 1
Author: cplusplus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-11 20:57:52

W php 7 znajduje się opcja php ini opcache.file_cache , który zapisuje kod bajtowy w określonym folderze. W może być przydatne w skrypcie php cli, które są "skompilowane" i zapisane w określonym folderze do zoptymalizowanego ponownego użycia.

Opcache nie jest kompilacją, ale jest czymś podobnym.

 1
Author: caiofior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 07:21:12

Jeśli możesz uruchamiać prawdziwe natywne binaria, 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 maszyny wirtualnej. Ten kod maszyny wirtualnej może być następnie interpretowany przez własny interpreter (również napisany w PHP, czy to nie szalone?) lub może być przetłumaczony na Bitcode. I używając frameworka kompilatora LLVM (clang i co), ten Bitcode można skompilować do natywny binarny dla każdej platformy obsługiwanej przez LLVM(praktycznie każdej platformy, która ma dziś znaczenie). Możesz to zrobić statycznie lub za każdym razem tuż przed wykonaniem kodu (styl JIT). Więc jedyne dwa wymagania dla tego kompilatora do pracy na Twoim systemie To zainstalowany interpreter PHP i zainstalowany kompilator clang.

Jeśli nie możesz uruchamiać natywnych binariów, możesz użyć powyższego kompilatora jako interpretera i pozwolić mu zinterpretować własny kod maszyny wirtualnej. bądź powolny, ponieważ używasz interpretera PHP, który sam działa na silniku PHP, więc masz "podwójną interpretację".

 1
Author: Mecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-01 09:58:52

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

 0
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 00:25:25

Istnieje również bcgen (Port PHP7 bcompilera):

Https://github.com/vjardin/bcgen/

(tylko PHP7.2)

 0
Author: Henrik Skov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-26 12:37:18