Можете ли вы «скомпилировать» код PHP? - PullRequest
212 голосов
/ 11 сентября 2009

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

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

Ответы [ 11 ]

228 голосов
/ 11 сентября 2009

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

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

Phalanger

РНС

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

Roadsend PHP Compiler

bcompiler

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

Project Zero

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

Bambalam

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

BinaryPHP

  • компилируется в C ++
  • выглядит больше не выпускается (февраль 2014 г.) - последнее изменение в 2003
22 голосов
/ 11 сентября 2009

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

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

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

16 голосов
/ 06 октября 2010

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

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

11 голосов
/ 19 декабря 2010

Существует также

которая нацелена

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

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

8 голосов
/ 06 ноября 2011

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

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

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

8 голосов
/ 26 сентября 2009

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

7 голосов
/ 27 января 2011

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

2 голосов
/ 12 мая 2011

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

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

1 голос
/ 15 сентября 2017

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

Opcache не компилируется, но похож на него.

1 голос
/ 12 декабря 2013

см. 5.5.x со встроенным модулем OPcache, энергозависимым в разделяемой памяти, гораздо большей производительностью и принципом динамичности php остаются без изменений.

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

...