Você pode "compilar" o código PHP e fazer upload de um arquivo binário-ish, que será executado apenas pelo interpretador de código de bytes?

224

Eu sei que o PHP é compilado para código de bytes antes de ser executado no servidor e, em seguida, esse código de bytes pode ser armazenado em cache para que todo o script não precise ser reinterpretado a cada acesso à Web.

Mas você pode "compilar" o código PHP e fazer upload de um arquivo binário-ish, que será executado apenas pelo interpretador de código de bytes?

Carson Myers
fonte
Uma questão relacionada: Compilador PHP para Windows
Palec
3
Por favor, não marque isso com hhvm nem hiphop . O HHVM não é uma parte inerente da pergunta, apenas uma resposta possível. meta.stackexchange.com/a/149347/238706
Palec
@HalayemAnis Acho que você mencionou um link errado. Você pode fornecer o link correto para esse tutorial? ou alguma atualização mais recente?
CJ Ramki
@CJRamki desculpe, por favor use este link COMPILE_PHP
Halayem Anis
Esta questão é realmente bastante vaga. Você pode "simplesmente" construir um compilador PHP que compila (no seu significado máximo) seu código-fonte e um interpretador PHP em um ELF, EXE ou qualquer outra coisa.
Sebastian Mach

Respostas:

234

Depois que essa pergunta foi feita, o Facebook lançou o HipHop para PHP, que provavelmente é o compilador PHP mais testado até o momento (visto que ele executava um dos 10 maiores sites do mundo). No entanto, o Facebook o interrompeu em favor do HHVM, que é uma máquina virtual, não um compilador.

Além disso, o Google busca PHP compilervárias soluções de terceiros.

Torta de pêssego

  • PeachPie GitHub
  • compila PHP para .NET e .NET Core
  • pode ser compilado em arquivo binário independente
  • roda em Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

  • GitHub (download), Wikipedia
  • compila para .NET (CIL) parece descontinuado a partir de julho de 2017 e parece não suportar o PHP 7.

phc

  • compila em binários nativos
  • não muito ativo agora (fevereiro de 2014) - última versão em 2011, última alteração no verão de 2013

Compilador Roadsend PHP

bcompiler

  • Extensão PECL do PHP
  • experimental
  • compila no bytecode PHP, mas pode envolvê-lo no binário do Windows que carrega o interpretador PHP (consulte o bcompiler_write_exe_footer()manual )
  • parece descontinuado agora (fevereiro de 2014) - última alteração em 2011

Projeto Zero

  • Wikipedia , IBM
  • incubadora de mudanças para o WebSphere sMash
  • suportado pela IBM
  • compila para bytecode Java
  • parece descontinuado agora (fevereiro de 2014) - o site está fora do ar, parece um grande hype em 2008 e 2009

Bambalam

  • compila em binários independentes do Windows
  • os binários contêm bytecode e um iniciador
  • parece descontinuado agora (fevereiro de 2014) - última alteração em 2006

BinaryPHP

  • compila para C ++
  • parece descontinuado agora (fevereiro de 2014) - última alteração em 2003
Frank Farmer
fonte
E quanto ao host compartilhado? Posso compilar meu script PHP com um desses compiladores e depois fazer o upload para o meu host baseado em Linux?
SaidbakR
2
@ sємsєм depende do seu host, mas se eu tivesse que adivinhar, eu acho que muitos hosts não permitiriam.
Frank Farmer
2
Nenhum desses projetos acima parece mais ser mantido. Existe um compilador geralmente aceito desde os últimos 2 anos ou por que todos esses projetos são desconsiderados / abandonados?
Preexo
Uma boa lista de compiladores PHP está em thefreecountry.com. Todas as ferramentas mencionadas estão incluídas nesta resposta agora.
Palec
1
Como tudo isso parece morto, a resposta parece ser "não".
amigos estão dizendo sobre ira baxter
22

A resposta curta é não".

A implementação atual do PHP é a de uma linguagem interpretada. Você pode argumentar os aspectos teóricos do fato de que qualquer linguagem pode ser tecnicamente interpretada ou compilada, mas, como está, as implementações atuais são tais que o código PHP exige que um intérprete seja executado, e o intérprete gerencia o ambiente de execução.

Para responder sua pergunta sobre o upload de bytecode PHP pré-compilado, provavelmente é possível, mas você teria que implementar uma maneira de o interpretador PHP ler esse arquivo e trabalhar com ele. Com os caches de opcode existentes já disponíveis, não parece uma tarefa que receba muita recompensa.

zombat
fonte
3
Geralmente, você precisa de um intérprete para executar adequadamente os programas PHP, mas isso não significa que um compilador não possa fornecê-lo no código compilado. O phc (phpcompiler.org) lida com todos os problemas que você descreve. Que eu saiba, Roadsend (roadsend.com) também.
22610 Paul Biggar #
28
Esta resposta está desatualizada - O HipHop foi lançado 6 meses depois de publicado, em fevereiro de 2010. #
Frank Farmer
1
@FrankFarmer Você já teve alguma experiência com o HipHop? O HipHop funciona corretamente com includee require? Por exemplo, se um script PHP geralmente está incluído include( 'controller/' . $controller_name . '.php' ), isso funcionará automaticamente com o HipHop? Cheers
Lea Hayes
2
Na verdade, você pode compilar código PHP usando compiladores PHP regulares. Depende apenas da plataforma de destino; você pode compilar em Zend opcode, a linguagem C ou em .NET assembléias (usando Phalanger php-compiler.net )
Jakub Misek
1
The short answer is "no". The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects…Não há nada teórico sobre isso, muitas linguagens interpretadas têm compiladores; viz AutoIt / AutoHotkey, ou mesmo em BASIC. Existem muitos programas que foram escritos nesses e compilados para serem usados ​​pelo público como programas independentes. Não há nada de especial no PHP para impedir que ele seja compilável, e é por isso que existem muitos compiladores, mas, diferentemente do AHK, não há um compilador oficial, testado - o Zend Guard não conta.
Synetech
16

Desde que a pergunta foi feita pela primeira vez, houve uma alteração nessa resposta de um "não" para um "tipo de"

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

O Hip Hop para PHP foi um compilador que pegou o código PHP e o transformou em C ++ altamente otimizado Aparentemente, algumas funções não são suportadas (por exemplo, 'explodir')

Encontrei essa pergunta enquanto procurava mais informações sobre como implementar o HipHop e pensei em falar :)

Desde 2013, o Facebook não usa mais, no entanto, e foi descontinuado em favor do HHVM, que não é um compilador: https://en.wikipedia.org/wiki/HipHop_for_PHP

Alex C
fonte
3
este é o que o Facebook usos que eu acredito
Richard H
O "tipo de" está agora alguns anos atrás e, como o HHVM (HipHop Php) está ficando cada vez melhor a cada dia, finalmente existe uma maneira (eu acho). Usando o HHVM, atualmente é possível pre-analyzeo código php. Como resultado, você obtém um arquivo de cache binário. Com esse arquivo e a configuração correta do HHVM, é possível executar uma página da Web apenas com bytecode, sem a necessidade dos arquivos de origem;) <br> Espero ter acertado.
PKeidel #
@ Andrea, o que você quer dizer com HHVM sendo preterido? Parece mantido e vivo como um projeto. Ou você quer dizer que o nome mudou de Hip Hop para PHP para HHVM? Então falar sobre depreciação é enganoso.
Palec 28/01
1
O @Palec HipHop para PHP foi descontinuado. Era um compilador de PHP para C ++ que o Facebook usava, mas produzia uma saída difícil (binários com vários GB) e não suportava a linguagem completa. O HHVM é um projeto sucessor que compartilha parte do mesmo código, mas não é um compilador. HHVM é uma máquina virtual. O Facebook não oferece mais suporte ao HipHop.
Andrea
11

Há também

que visa

  • Para codificar o script inteiro em um aplicativo PHP proprietário
  • Para codificar algumas classes e / ou funções em um aplicativo PHP proprietário
  • Para habilitar a produção de aplicativos php-gtk que podem ser usados ​​em áreas de trabalho de clientes, sem a necessidade de um php.exe.
  • Para fazer o estudo de viabilidade de um conversor PHP para C

A extensão está disponível no PECL.

Gordon
fonte
8

O phc permite que você compile programas PHP em bibliotecas compartilhadas, que podem ser carregadas no servidor. O programa PHP é compilado em binários. É feito de maneira a suportar evals, se includetoda a biblioteca padrão do PHP.

Paul Biggar
fonte
8

Se você está simplesmente procurando produzir um executável binário a partir de um script PHP, evite tentar tornar sua pergunta extremamente precisa, pois fará parecer que você sabe exatamente o que precisa. Além disso, a maioria dos desenvolvedores de PHP não tem absolutamente nenhuma pista sobre o que é um bytecode.

Com isso dito, as respostas são SIM . Acabei de compilar um script PHP em um binário. E não apenas qualquer binário. Eu usei o aplicativo CDE (link para Wayback Machine, o link original agora está quebrado) para transformá-lo em um binário portátil que pode ser distribuído com todas as dependências e executado sem nenhum problema ... e funciona lindamente.

Tudo que você precisa é usar phc .

asiby
fonte
7

Alguém ouviu falar de Zend Guard , que faz exatamente o que essa pessoa está pedindo. Ele codifica / ofusca o código PHP em "código de máquina".

John Dillick
fonte
1
Eu não acho que eles queriam ofuscação tanto quanto as acelerações resultantes da interoperabilidade do código de bytes e não da fonte.
Stephen
O Stephen Zend Guard também deve fazer isso.
Gajus 17:00
O Zend Guard decidiu não oferecer suporte ao PHP 7, o que é uma desvantagem - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj
2

Existem vários "compiladores" de código PHP. A maioria deles não suporta todos os recursos do PHP, pois eles devem ser interpretados durante o tempo de execução.

Estamos usando o Phalanger - http://www.php-compiler.net/ - que suporta até mesmo esses recursos dinâmicos PHP sujos e ainda é capaz de compilá-los como um assembly .NET, que pode ser distribuído como uma DLL independente.

Jakub Míšek
fonte
1

No php 7, existe a opção php ini opcache.file_cache que salva o bytecode em uma pasta específica. In pode ser útil no script php cli que é "compilado" e salvo em uma pasta específica para uma reutilização otimizada.

Opcache não está compilando, mas é algo semelhante.

caiofior
fonte
"Em php 7" não é PHP7 única, é PHP 5.5.0 e mais tarde
Raymond Nijland
0

O PHP realmente não é compilado como em muitos programas. Você pode usar o codificador do Zend para torná-lo ilegível.

Joe
fonte
não é compilado da mesma maneira que o perl é compilado?
Carson Myers
PHP é compilado no servidor em tempo real, eu acredito. Eu usei um codificador para ocultar o código fonte. Se é com isso que você está preocupado. Eles funcionam muito bem.
Joe
nah, eu estava apenas interessado no aspecto teórico-lo
Carson Myers
2
PHP não é cumprido, é uma linguagem interpretada. o cache contém 'opcodes' interpreta whitch php (não ter que ler o texto), código php não pode ser 'run' diretamente como você faria com c
borrel
0

Se você tem permissão para executar binários nativos reais, este é o seu compilador:

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

É um compilador PHP escrito em PHP!

Ele compila o código PHP para seu próprio código de VM. Esse código da VM pode ser interpretado por seu próprio intérprete (também escrito em PHP, não é louco?) Ou pode ser traduzido para o Bitcode. E usando a estrutura do compilador LLVM ( clange co), esse Bitcode pode ser compilado em um binário nativo para qualquer plataforma compatível com o LLVM (praticamente qualquer plataforma que seja importante hoje). Você pode optar por fazer isso estaticamente ou a cada vez imediatamente antes da execução do código (estilo JIT). Portanto, os únicos dois requisitos para esse compilador funcionar em seu sistema são um interpretador PHP instalado e um clangcompilador instalado .

Se você não tiver permissão para executar binários nativos, poderá usar o compilador acima como um intérprete e deixá-lo interpretar seu próprio código de VM. No entanto, isso será lento, pois você estará executando um intérprete PHP que está sendo executado em um mecanismo PHP, portanto você tem uma "dupla interpretação".

Mecki
fonte