Чи можете ви "компілювати" PHP-код і завантажити файл бінарного ish-файлу, який буде запускатися інтерпретатором байт-коду?


224

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

Але чи можете ви "компілювати" PHP-код і завантажити файл бінарного ish-файлу, який буде просто запускатися інтерпретатором байт-коду?


Питання, пов’язані з цим: компілятор PHP для Windows
Palec

3
Будь ласка , не маркується це з hhvm ні HipHop . HHVM - не притаманна частина питання, а лише можлива відповідь. meta.stackexchange.com/a/149347/238706
Палець

@HalayemAnis Я думаю, що ви вказали неправильне посилання .. Чи можете ви надати правильне посилання для цього підручника? або будь-які останні оновлення хлопці?
CJ Ramki

@CJRamki Вибачте, будь ласка, скористайся цим посиланням COMPILE_PHP
Halayem Anis

Це питання насправді досить розпливчасте. Ви можете "просто" створити компілятор PHP, який компілює (у повному розумінні) свій вихідний код та інтерпретатор PHP в ELF, EXE або інше.
Себастьян Мах

Відповіді:


234

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

Крім того, googling виявляє PHP compilerряд сторонніх рішень.

PeachPie

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

Фаланжер

  • GitHub (завантажити), Вікіпедія
  • компілює в .NET (CIL), як видається, припинено з липня 2017 року і, здається, не підтримує PHP 7.

phc

  • компілює до рідних бінарних файлів
  • не дуже активно зараз (лютий 2014 р.) - остання версія 2011 року, остання зміна влітку 2013 року

PHP-компілятор Roadsend

bcompiler

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

Нуль проекту

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

Бамбалам

  • компілює в автономні бінарні файли Windows
  • двійкові файли містять байт-код і пусковий механізм
  • виглядає припиненою зараз (лютий 2014 р.) - остання зміна 2006 року

Бінарний PHP

  • компілює на C ++
  • виглядає припиненою зараз (лютий 2014 р.) - остання зміна у 2003 році

Що щодо спільного веб-хостингу? Чи можу я скомпілювати свій PHP-скрипт з одним із цих компіляторів, а потім завантажити на свій веб-хостинг на базі Linux?
SaidbakR

2
@ sêsêm, це залежить від вашого господаря, але якби я мав здогадуватися, я б припустив, що багато господарів цього не дозволять.
Френк Фермер

2
Жоден із зазначених вище проектів, здається, більше не підтримується. Чи існує загальновизнаний компілятор за останні 2 роки або чому всі ці проекти не враховуються / відмовляються?
Preexo

Список мило PHP компіляторів знаходиться в thefreecountry.com. Усі інструменти, згадані там, зараз включені у цю відповідь.
Палець

1
Оскільки всі вони здаються мертвими, відповідь здається "ні".
Іра Бакстер

22

Коротка відповідь - «ні».

Поточна реалізація PHP - це інтерпретована мова. Ви можете аргументувати теоретичні аспекти того, що будь-яку мову технічно можна інтерпретувати або компілювати, але, як це існує, поточні реалізації такі, що для PHP-коду потрібен запуск інтерпретатора, а інтерпретатор управляє виконавчим середовищем.

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


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

28
Ця відповідь застаріла - HipHop був випущений через 6 місяців після публікації, у лютому 2010 р.
Frank Farmer

1
@FrankFarmer У вас був досвід роботи з HipHop? Чи HipHop правильно працює з includeта require? Наприклад, якщо зазвичай включається скрипт PHP, include( 'controller/' . $controller_name . '.php' )чи автоматично це працюватиме з HipHop? ура
Lea Hayes

2
Насправді ви можете компілювати PHP-код, використовуючи звичайні компілятори PHP. Це просто залежить від цільової платформи; ви можете компілювати в Zend opcode, мову С або в .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

Хіп-хоп для PHP був компілятором, який прийняв PHP-код і перетворив його на високооптимізований C ++. Очевидно, деякі функції не підтримуються (наприклад, "вибухнути")

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

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


3
це те, чим користується фейсбук, я вважаю
Річард Н

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

@Andrea, що ти маєш на увазі під застарілим HHVM? Це виглядає підтримуваним і живим як проект. Або ви маєте на увазі, що ім'я змінилося з Hip Hop для PHP на HHVM? Тоді говорити про депресію є оманливим.
Палець

1
@Palec HipHop для PHP було припинено. Facebook використовував компілятор PHP-до-C ++, але він дав нелегкий вихід (бінарні файли з кількома ГБ) і не міг підтримувати повну мову. 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, яка зберігає байт-код у певній папці. In може бути корисним для сценарію php cli, який "компілюється" і зберігається у певній папці для оптимізованого повторного використання.

Opcache це не компілює, але є чимось подібним.


"У php 7" це не PHP7, це PHP 5.5.0, а пізніше
Raymond Nijland,

0

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


Хіба це не складено так, як збирається Perl?
Карсон Майєрс

PHP складається на сервері на льоту, я вважаю. Я використовував кодер, щоб приховати вихідний код. Якщо це те, про що ви турбуєтесь. Вони працюють дуже добре.
Джо,

так, мене просто зацікавив теоретичний аспект цього
Карсон Майєрс,

2
PHP не виконується, його інтерпретована мова. кеш містить "опкоди", які інтерпретує php (не потрібно читати текст), php-код не може бути "запущений" безпосередньо так, як це було б з c
borrel

0

Якщо вам дозволено запускати справжні рідні бінарні файли, то це ваш компілятор:

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

Це компілятор PHP, написаний на PHP!

Він компілює PHP-код до власного коду VM. Цей код VM може бути або інтерпретований його власним інтерпретатором (також написаний на PHP, чи не божевільний?), Або його можна перекласти на біткод. І використовуючи рамку компілятора LLVM ( clangі спільно), цей Bitcode може бути скомпільований у основний бінарний файл для будь-якої платформи, яку підтримує LLVM (майже будь-яка платформа, яка має значення сьогодні). Ви можете зробити це статично або кожен раз перед виконанням коду (стиль JIT). Отже, єдині дві вимоги до цього компілятора для роботи у вашій системі - це встановлений інтерпретатор PHP та встановлений clangкомпілятор.

Якщо вам заборонено запускати нативні бінарні файли, ви можете використовувати компілятор вище як інтерпретатор і дозволити інтерпретувати власний код VM, але це буде повільно, оскільки ви використовуєте інтерпретатор PHP, який сам працює на двигуні PHP, у вас є "подвійне тлумачення".


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.