Можете ли вы «скомпилировать» код PHP и загрузить файл двоичного кода, который будет просто выполняться интерпретатором байт-кода?


225

Я знаю, что PHP скомпилирован в байт-код перед его запуском на сервере, а затем этот байт-код может быть кэширован, так что весь сценарий не должен быть повторно интерпретирован при каждом веб-доступе.

Но можете ли вы «скомпилировать» код PHP и загрузить файл двоичного кода, который будет просто выполняться интерпретатором байт-кода?



3
Пожалуйста, не помечайте это ни hhvm, ни хип-хопом . HHVM - это не неотъемлемая часть вопроса, а возможный ответ. meta.stackexchange.com/a/149347/238706
Палек

@HalayemAnis Я думаю, что вы упомянули неправильную ссылку. Можете ли вы предоставить правильную ссылку для этого урока? или какие-нибудь последние обновления, ребята?
CJ Рамки

@CJRamki извините, пожалуйста, используйте эту ссылку COMPILE_PHP
Halayem Anis

Этот вопрос на самом деле довольно расплывчатый. Вы можете «просто» создать компилятор PHP, который компилирует (в полном смысле) ваш исходный код и интерпретатор PHP в ELF, EXE или что-то еще.
Себастьян Мах

Ответы:


234

После того, как этот вопрос был задан, Facebook запустил HipHop для PHP, который, вероятно, является самым проверенным PHP-компилятором на сегодняшний день (поскольку он работает на одном из 10 крупнейших сайтов мира). Однако Facebook прекратил его в пользу HHVM, который является виртуальной машиной, а не компилятором.

Помимо этого, поиск в Google PHP compilerприводит к появлению ряда сторонних решений.

PeachPie

  • PeachPie GitHub
  • компилирует PHP в .NET и .NET Core
  • может быть скомпилирован в отдельный двоичный файл
  • работает на Mac, Linux, Windows, Windows Core, ARM, ...

кускус

  • GitHub (скачать), Википедия
  • Компиляция в .NET (CIL) прекращена с июля 2017 года и, похоже, не поддерживает PHP 7.

ПМП

  • компилируется в собственные двоичные файлы
  • не очень активно сейчас (февраль 2014 г.) - последняя версия 2011 г., последние изменения летом 2013 г.

Roadsend PHP Compiler

bcompiler

  • PECL расширение PHP
  • экспериментальный
  • компилируется в байт-код PHP, но может обернуть его в двоичный файл Windows, который загружает интерпретатор PHP (см. bcompiler_write_exe_footer()руководство )
  • выглядит прекращено сейчас (февраль 2014) - последнее изменение в 2011

Project Zero

  • Википедия , IBM
  • инкубатор изменений для WebSphere sMash
  • поддерживается IBM
  • компилируется в байт-код Java
  • выглядит прекращено сейчас (февраль 2014) - веб-сайт не работает, выглядит как большой ажиотаж в 2008 и 2009 годах

Bambalam

  • компилируется в автономные двоичные файлы Windows
  • двоичные файлы содержат байт-код и модуль запуска
  • выглядит прекращено сейчас (февраль 2014) - последнее изменение в 2006

BinaryPHP

  • компилируется в C ++
  • выглядит прекращено сейчас (февраль 2014) - последнее изменение в 2003

Как насчет общего веб-хостинга? Могу ли я скомпилировать свой PHP-скрипт с помощью одного из этих компиляторов, а затем загрузить его на свой веб-хостинг на основе Linux?
SaidbakR

2
@ sємsєм, это зависит от вашего хоста, но если бы мне пришлось угадывать, я бы сказал, что многие хосты этого не допустят.
Фрэнк Фармер

2
Ни один из вышеперечисленных проектов, похоже, больше не поддерживается. Существует ли общепринятый компилятор за последние 2 года или почему все эти проекты игнорируются / заброшены?
Preexo

Список мило PHP компиляторов находится в thefreecountry.com. Все инструменты, упомянутые там, включены в этот ответ сейчас.
Palec

1
Поскольку все они кажутся мёртвыми, ответом будет «нет».
Ира Бакстер

22

Короткий ответ - нет".

Текущая реализация PHP - это интерпретируемый язык. Вы можете поспорить с теоретическими аспектами того факта, что любой язык может быть технически интерпретирован или скомпилирован, но в его нынешнем виде такие реализации таковы, что для выполнения PHP-кода требуется интерпретатор, а интерпретатор управляет исполняющей средой.

Чтобы ответить на ваш вопрос о загрузке предварительно скомпилированного байт-кода PHP, это, возможно, возможно, но вам нужно было бы реализовать способ интерпретатора PHP для чтения в таком файле и работы с ним. С уже существующими кэшами кодов операций это не похоже на задачу, которая принесет много пользы.


3
Часто бывает так, что вам нужен интерпретатор для правильного запуска программ PHP, но это не значит, что компилятор не может предоставить его в скомпилированном коде. phc (phpcompiler.org) обрабатывает все проблемы, которые вы описываете. Насколько мне известно, Roadsend (roadsend.com) тоже.
Пол Биггар

28
Этот ответ устарел - HipHop был выпущен через 6 месяцев после публикации, в феврале 2010 года.
Фрэнк Фармер

1
@FrankFarmer У вас был опыт работы с хип-хопом? Имеет ли HipHop правильно работать с includeи require? Например, если с PHP обычно включается скрипт, include( 'controller/' . $controller_name . '.php' )будет ли он автоматически работать с HipHop? ура
Леа Хейс

2
На самом деле вы можете скомпилировать код PHP, используя обычные PHP-компиляторы. Это зависит только от целевой платформы; Вы можете скомпилировать в код операции Zend, язык C или сборки .NET (используя Phalanger php-compiler.net )
Якуб Мишек

1
The short answer is "no". The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects…В этом нет ничего теоретического, во многих интерпретируемых языках есть компиляторы; а именно AutoIt / AutoHotkey, или даже еще до BASIC. Есть много программ, которые были написаны для них, а затем скомпилированы для публичного использования в качестве автономных программ. В PHP нет ничего особенного, чтобы предотвратить его компиляцию, поэтому существует множество компиляторов, но в отличие от AHK, нет официального, проверенного, компилятора - Zend Guard не совсем в счет.
Synetech

16

С тех пор, как вопрос был задан впервые, в этом ответе произошла смена ответа «нет» на «вид»

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

Hip Hop for PHP был компилятором, который взял код PHP и превратил его в высоко оптимизированный C ++. Очевидно, некоторые функции не поддерживаются (например, «взорвать»)

Я нашел этот вопрос, ища больше информации о том, как реализовать HipHop, и подумал, что я буду говорить :)

Однако с 2013 года Facebook больше не использует его, и он был прекращен в пользу HHVM, который не является компилятором: https://en.wikipedia.org/wiki/HipHop_for_PHP


3
это то, что Facebook использует, я верю
Ричард Х

«Вид» отстает уже несколько лет назад, и с тех пор, как HHVM (HipHop Php) с каждым днем ​​становится все лучше и лучше, наконец-то есть выход (я думаю). Использование HHVM в настоящее время возможно для pre-analyzephp-кода. В результате вы получаете файл двоичного кэша. С этим файлом и правильной конфигурацией HHVM можно запускать веб-страницу только с байт-кодом, больше не нужно исходных файлов;) <br> Я надеюсь, что все правильно.
PKeidel

@ Андреа, что ты имеешь в виду, когда HHVM считается устаревшим? Это выглядит поддержанным и живым как проект. Или вы имеете в виду, что название изменилось с Hip Hop for PHP на HHVM? Тогда разговоры об амортизации вводят в заблуждение.
Палек

1
@Palec HipHop для PHP был прекращен. Это был компилятор PHP-to-C ++, который использовал Facebook, но он выдавал громоздкий вывод (двоичные файлы размером в несколько ГБ) и не мог поддерживать полный язык. HHVM - это проект-преемник, который использует один и тот же код, но не является компилятором. HHVM - это виртуальная машина. Facebook больше не поддерживает HipHop.
Андреа

11

А также есть

которая направлена

  • Кодировать весь скрипт в проприетарном приложении PHP
  • Для кодирования некоторых классов и / или функций в проприетарном приложении PHP
  • Чтобы включить создание приложений php-gtk, которые можно использовать на клиентских компьютерах, без необходимости использования php.exe.
  • Сделать технико-экономическое обоснование для конвертера PHP в C

Расширение доступно от PECL.


8

phc позволяет вам компилировать PHP-программы в разделяемые библиотеки, которые можно загружать на сервер. Программа PHP скомпилирована в двоичные файлы. Это сделано таким образом, чтобы поддерживать evals, includes и всю стандартную библиотеку PHP.


8

Если вы просто ищете способ создания бинарного исполняемого файла из сценария PHP, пожалуйста, не пытайтесь сделать ваш вопрос чрезвычайно точным, потому что это покажет, что вы точно знаете, что вам нужно. Кроме того, большинство разработчиков PHP не имеют ни малейшего представления о том, что такое байт-код.

С учетом сказанного, ответы ДА . Я только что закончил компиляцию скрипта PHP в двоичный файл. И не просто двоичный. Я использовал приложение CDE (ссылка на Wayback Machine, исходная ссылка теперь не работает), чтобы превратить его в переносимый двоичный файл, который можно распространять со всеми зависимостями и выполнять без каких-либо проблем ... и он прекрасно работает.

Все, что вам нужно, это использовать phc .


7

Хм, кто-нибудь слышал о Zend Guard , который делает именно то, что просит этот человек. Он кодирует / запутывает код PHP в «машинный код».


1
Я не думаю, что они хотели запутывать столько, сколько ускорения, возникающие из-за взаимодействия байт-кода, а не источника.
Стивен

@Stephen Zend Guard также предназначен для этого.
Gajus

Zend Guard решил не поддерживать PHP 7, что является недостатком - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj

2

Есть несколько «компиляторов» кода PHP. Большинство из них не поддерживают все функции PHP, поскольку их просто нужно интерпретировать во время выполнения.

Мы используем Phalanger - http://www.php-compiler.net/ - который поддерживает даже эти грязные динамические функции PHP и все еще способен компилировать их как сборку .NET, которая может распространяться как отдельная DLL.



1

В php 7 есть опция php ini opcache.file_cache, которая сохраняет байт-код в определенной папке. Это может быть полезно для сценария php cli, который «компилируется» и сохраняется в определенной папке для оптимизированного повторного использования.

Opcache это не компиляция, но что-то похожее.


«В php 7» это не только PHP7, это PHP 5.5.0 и более поздние
Raymond Nijland

0

PHP на самом деле не компилируется, как во многих программах. Вы можете использовать кодировщик Zend, чтобы сделать его нечитаемым, хотя.


не компилируется ли он так же, как компилируется perl?
Карсон Майерс

Я считаю, что PHP компилируется на сервере на лету. Я использовал кодировщик, чтобы скрыть исходный код. Если это то, что вас беспокоит. Они работают очень хорошо.
Джо

нет, меня просто заинтересовал теоретический аспект этого
Карсон Майерс

2
PHP не соблюдается, это интерпретируемый язык. Кэш содержит «opcodes», которые интерпретирует php (не нужно читать текст), код php нельзя «запустить» напрямую, как это было бы с c
borrel

0

Если вам разрешено запускать настоящие собственные двоичные файлы, то это ваш компилятор:

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

Это PHP-компилятор, написанный на PHP!

Он компилирует код PHP в свой собственный код VM. Этот код виртуальной машины может быть либо интерпретирован его собственным интерпретатором (также написанным на PHP, не правда ли?), Либо он может быть переведен в битовый код. А с использованием инфраструктуры компилятора LLVM ( clangи совместно) этот битовый код может быть скомпилирован в собственный двоичный файл для любой платформы, которую поддерживает LLVM (в значительной степени для любой платформы, которая имеет значение сегодня). Вы можете сделать это статически или каждый раз перед выполнением кода (стиль JIT). Таким образом, для работы этого компилятора требуется только два требования: установленный интерпретатор PHP и установленный clangкомпилятор.

Если вам не разрешено запускать собственные двоичные файлы, вы можете использовать вышеупомянутый компилятор в качестве интерпретатора и позволить ему интерпретировать свой собственный код виртуальной машины, однако это будет медленным, поскольку вы запускаете интерпретатор PHP, который сам работает на движке PHP, поэтому у вас есть «двойная интерпретация».


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.