Puoi "compilare" il codice PHP e caricare un file binario-ish, che verrà semplicemente eseguito dall'interprete del codice byte?


225

So che PHP viene compilato in codice byte prima che venga eseguito sul server, quindi quel codice byte può essere memorizzato nella cache in modo che l'intero script non debba essere reinterpretato con ogni accesso al web.

Ma puoi "compilare" il codice PHP e caricare un file binario-ish, che verrà semplicemente eseguito dall'interprete del codice byte?


Una domanda correlata: compilatore PHP per Windows
Palec

3
Si prega di non contrassegnare questo con hhvmhiphop . HHVM non è una parte intrinseca della domanda, solo una possibile risposta. meta.stackexchange.com/a/149347/238706
Palec,

@HalayemAnis Penso che tu sia menzionato un link sbagliato .. Puoi fornire il link corretto per quel tutorial? o qualche ultimo aggiornamento ragazzi?
CJ Ramki,

@CJRamki scusa, utilizza questo link COMPILE_PHP
Halayem Anis,

Questa domanda è in realtà piuttosto vaga. Potresti "semplicemente" costruire un compilatore PHP che compili (nel suo significato più completo) il tuo codice sorgente e un interprete PHP in un ELF, EXE o altro.
Sebastian Mach,

Risposte:


234

Dopo che questa domanda è stata posta, Facebook ha lanciato HipHop per PHP che è probabilmente il compilatore PHP più testato finora (visto che gestiva uno dei 10 siti web più grandi del mondo). Tuttavia, Facebook lo ha interrotto a favore di HHVM, che è una macchina virtuale, non un compilatore.

Oltre a ciò, Google cerca PHP compilerdiverse soluzioni di terze parti.

Torta di Pesche

  • PeachPie GitHub
  • compila PHP in .NET e .NET Core
  • può essere compilato in un file binario autonomo
  • funziona su Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

  • GitHub (download), Wikipedia
  • la compilazione in .NET (CIL) sembra interrotta da luglio 2017 e non sembra supportare PHP 7.

PHC

  • compila in binari nativi
  • non molto attivo ora (febbraio 2014) - ultima versione nel 2011, ultima modifica nell'estate 2013

Compilatore PHP Roadsend

bcompiler

  • Estensione PECL di PHP
  • sperimentale
  • si compila in bytecode PHP, ma può racchiuderlo nel binario di Windows che carica l'interprete PHP (consultare il bcompiler_write_exe_footer()manuale )
  • sembra interrotto ora (febbraio 2014) - ultima modifica nel 2011

Project Zero

  • Wikipedia , IBM
  • incubatore di modifiche per WebSphere sMash
  • supportato da IBM
  • compila in bytecode Java
  • sembra interrotto ora (febbraio 2014) - sito web inattivo, sembra grande clamore nel 2008 e nel 2009

Bambalam

  • compila in binari Windows autonomi
  • i binari contengono bytecode e un launcher
  • sembra interrotto ora (febbraio 2014) - ultima modifica nel 2006

BinaryPHP

  • compila in C ++
  • sembra interrotto ora (febbraio 2014) - ultima modifica nel 2003

Che dire dell'host web condiviso? Potrei compilare il mio script PHP con uno di quei compilatori e quindi caricarlo sul mio host web basato su Linux?
SaidbakR,

2
@ sємsєм dipende dal tuo host, ma se dovessi indovinare, immagino che molti host non lo permetterebbero.
Frank Farmer,

2
Nessuno di questi progetti sopra sembra essere più mantenuto. Esiste un compilatore generalmente accettato dagli ultimi 2 anni o perché tutti questi progetti vengono ignorati / abbandonati?
Preexo,

Una bella lista di compilatori PHP è disponibile su thefreecountry.com. Tutti gli strumenti qui menzionati sono ora inclusi in questa risposta.
Palec,

1
Dal momento che sembrano tutti morti, la risposta sembra essere "no".
Ira Baxter,

22

La risposta breve è "no".

L'attuale implementazione di PHP è quella di un linguaggio interpretato. Puoi argomentare gli aspetti teorici del fatto che qualsiasi linguaggio può essere tecnicamente interpretato o compilato, ma così com'è, le attuali implementazioni sono tali che il codice PHP richiede l'esecuzione di un interprete e l'interprete gestisce l'ambiente di esecuzione.

Per rispondere alla tua domanda sul caricamento di bytecode PHP precompilato, è probabilmente possibile, ma dovresti implementare un modo per l'interprete PHP di leggere in tale file e lavorare con esso. Con le cache di codici operativi esistenti già disponibili, non sembra un compito che raccolga molte ricompense.


3
Spesso è necessario un interprete per eseguire correttamente i programmi PHP, ma ciò non significa che un compilatore non possa fornirlo nel codice compilato. phc (phpcompiler.org) gestisce tutti i problemi che descrivi. Per quanto ne so, anche Roadsend (roadsend.com) lo fa.
Paul Biggar,

28
Questa risposta non è aggiornata - HipHop è stato rilasciato 6 mesi dopo la sua pubblicazione, nel febbraio 2010.
Frank Farmer,

1
@FrankFarmer Hai avuto esperienza con HipHop? HipHop funziona correttamente con includee require? Ad esempio, se di solito è incluso uno script PHP, include( 'controller/' . $controller_name . '.php' )funzionerà automaticamente con HipHop? salute
Lea Hayes,

2
In realtà puoi compilare il codice PHP, usando i normali compilatori PHP. Dipende solo dalla piattaforma di destinazione; puoi compilare in Zend opcode, linguaggio C o in assembly .NET (usando 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…Non c'è nulla di teorico al riguardo, molti linguaggi interpretati hanno compilatori; vale a dire AutoIt / AutoHotkey o addirittura fino a BASIC. Ci sono molti programmi che sono stati scritti in quelli, quindi compilati per l'uso da parte del pubblico come programmi autonomi. Non c'è nulla di speciale in PHP per impedire che sia compilabile, motivo per cui esistono un sacco di compilatori, ma a differenza di AHK, non esiste un compilatore ufficiale, testato, Zend Guard non conta abbastanza.
Synetech,

16

Da quando la domanda è stata posta per la prima volta, c'è stata una modifica a quella risposta da un "no" a un "tipo di"

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

Hip Hop per PHP era un compilatore che prendeva il codice PHP e lo trasformava in C ++ altamente ottimizzato Apparentemente, alcune funzioni non sono supportate (ad esempio "esplodere")

Ho trovato questa domanda mentre cercavo ulteriori informazioni su come implementare HipHop e ho pensato di parlare :)

Dal 2013, tuttavia, Facebook non lo utilizza più ed è stato sospeso a favore di HHVM, che non è un compilatore: https://en.wikipedia.org/wiki/HipHop_for_PHP


3
questo è quello che uso Facebook credo
Richard H

Il "tipo di" è ormai indietro di alcuni anni e poiché HHVM (HipHop Php) sta migliorando ogni giorno, alla fine c'è un modo (penso). Usando HHVM è oggi possibile pre-analyzeil codice php. Di conseguenza si ottiene un file cache binaria. Con questo file e la corretta configurazione HHVM, è possibile eseguire una pagina Web solo con bytecode, non sono più necessari i file di origine;) <br> Spero di aver capito bene.
PKeidel,

@Andrea, cosa intendi con HHVM deprecato? Sembra mantenuto e vivo come un progetto. O vuoi dire che il nome è cambiato da Hip Hop per PHP a HHVM? Quindi parlare di deprecazione è fuorviante.
Palec,

1
@Palec HipHop per PHP è stato sospeso. Era un compilatore da PHP a C ++ che Facebook usava, ma produceva output ingombranti (binari multi-GB) e non poteva supportare l'intero linguaggio. HHVM è un progetto successivo che condivide parte dello stesso codice, ma non è un compilatore. HHVM è una macchina virtuale. Facebook non supporta più HipHop.
Andrea,

11

C'è anche

quali obiettivi

  • Per codificare l'intero script in un'applicazione PHP proprietaria
  • Per codificare alcune classi e / o funzioni in un'applicazione PHP proprietaria
  • Per consentire la produzione di applicazioni php-gtk che potrebbero essere utilizzate sui desktop client, senza la necessità di php.exe.
  • Fare lo studio di fattibilità per un convertitore da PHP a C.

L'estensione è disponibile da PECL.


8

phc ti consente di compilare programmi PHP in librerie condivise, che possono essere caricate sul server. Il programma PHP è compilato in binari. È fatto in modo tale da supportare evals, includes e l'intera libreria standard PHP.


8

Se stai semplicemente cercando di produrre un eseguibile binario da uno script PHP, evita di provare a rendere la tua domanda estremamente precisa perché ti sembrerà di sapere esattamente di cosa hai bisogno. Inoltre, la maggior parte degli sviluppatori PHP non ha assolutamente idea di cosa sia un bytecode.

Detto questo, la risposta è . Ho appena finito di compilare uno script PHP in un file binario. E non solo qualsiasi binario. Ho usato l' applicazione CDE (collegamento a Wayback Machine, il collegamento originale ora è rotto) per trasformarlo in un binario portatile che può essere distribuito con tutte le dipendenze ed eseguito senza alcun problema ... e funziona magnificamente.

Tutto ciò che serve è usare phc .


7

Qualcuno ha sentito parlare di Zend Guard , che fa esattamente quello che questa persona sta chiedendo. Codifica / offusca il codice PHP in "codice macchina".


1
Non penso che volessero offuscare tanto quanto gli speedups derivanti dall'interpretazione del bytecode piuttosto che dalla fonte.
Stephen,

@Stephen Zend Guard è pensato anche per questo.
Gajus,

Zend Guard ha deciso di non supportare PHP 7 che è un aspetto
vj

2

Esistono diversi "compilatori" di codice PHP. La maggior parte di essi non supporta tutte le funzionalità di PHP, poiché queste devono semplicemente essere interpretate durante il runtime.

Stiamo usando Phalanger - http://www.php-compiler.net/ - che supporta anche quelle sporche funzionalità dinamiche PHP, ed è ancora in grado di compilarle come assembly .NET, che può essere distribuito come una DLL autonoma.



1

In php 7 c'è l'opzione php ini opcache.file_cache che salva il bytecode in una cartella specifica. In potrebbe essere utile in php cli script che vengono "compilati" e salvati in una cartella specifica per un riutilizzo ottimizzato.

Opcache non si sta compilando ma è qualcosa di simile.


"In php 7" non è solo PHP7, è PHP 5.5.0 e versioni successive
Raymond Nijland

0

PHP non viene realmente compilato come con molti programmi. Puoi usare l'encoder di Zend per renderlo illeggibile però.


non viene compilato nello stesso modo in cui viene compilato il perl?
Carson Myers,

Credo che PHP sia compilato sul server al volo. Tuttavia, ho usato un codificatore per nascondere il codice sorgente. Se questo è ciò di cui sei preoccupato. Funzionano davvero bene.
Joe,

nah, ero solo interessato all'aspetto teorico di esso
Carson Myers,

2
PHP non è rispettato, è un linguaggio interpretato. la cache contiene "opcodes" che php interpreta (non è necessario leggere il testo), il codice php non può essere "eseguito" direttamente come faresti con c
borrel il

0

Se ti è permesso eseguire veri binari nativi, allora questo è il tuo compilatore:

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

È un compilatore PHP scritto in PHP!

Compila il codice PHP nel proprio codice VM. Questo codice VM può quindi essere interpretato dal suo stesso interprete (anche scritto in PHP, non è così folle?) Oppure può essere tradotto in Bitcode. E usando il framework del compilatore LLVM ( clange co), questo Bitcode può essere compilato in un binario nativo per qualsiasi piattaforma supportata da LLVM (praticamente qualsiasi piattaforma che conta oggi). Puoi scegliere di farlo staticamente o ogni volta appena prima dell'esecuzione del codice (stile JIT). Quindi gli unici due requisiti per far funzionare questo compilatore sul tuo sistema sono un interprete PHP installato e un clangcompilatore installato .

Se non ti è permesso eseguire binari nativi, potresti usare il compilatore sopra come interprete e lasciargli interpretare il suo codice VM, ma questo sarà lento mentre stai eseguendo un interprete PHP che è in esecuzione su un motore PHP, quindi hai una "doppia interpretazione".


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.