¿Puede "compilar" código PHP y cargar un archivo binario-ish, que solo será ejecutado por el intérprete de código de bytes?

225

Sé que PHP se compila en código de bytes antes de que se ejecute en el servidor, y luego ese código de bytes se puede almacenar en caché para que el script completo no tenga que ser reinterpretado con cada acceso web.

Pero, ¿puede "compilar" código PHP y cargar un archivo binary-ish, que solo será ejecutado por el intérprete de código de bytes?

Carson Myers
fuente
Una pregunta relacionada: compilador PHP para Windows
Palec
3
No etiquete esto con hhvm ni hiphop . HHVM no es una parte inherente de la pregunta, solo una posible respuesta. meta.stackexchange.com/a/149347/238706
Palec
@HalayemAnis Creo que te mencionan un enlace incorrecto. ¿Puedes proporcionar el enlace correcto para ese tutorial? o alguna última actualización chicos?
CJ Ramki
@CJRamki lo siento, por favor use este enlace COMPILE_PHP
Halayem Anis
Esta pregunta es realmente bastante vaga. Podría "simplemente" construir un compilador PHP que compila (en su significado más completo) su código fuente y un intérprete PHP en un ELF, EXE o lo que sea.
Sebastian Mach

Respuestas:

234

Después de hacer esta pregunta, Facebook lanzó HipHop para PHP, que es probablemente el compilador PHP mejor probado hasta la fecha (ya que ejecuta uno de los 10 sitios web más grandes del mundo). Sin embargo, Facebook lo suspendió a favor de HHVM, que es una máquina virtual, no un compilador.

Más allá de eso, googlear ofrece PHP compileruna serie de soluciones de terceros.

Melocotón

  • PeachPie GitHub
  • compila PHP a .NET y .NET Core
  • se puede compilar en un archivo binario autónomo
  • se ejecuta en Mac, Linux, Windows, Windows Core, ARM, ...

Falangero

  • GitHub (descargar), Wikipedia
  • compila a .NET (CIL) parece descontinuado a partir de julio de 2017 y no parece admitir PHP 7.

phc

  • compila a binarios nativos
  • no muy activo ahora (febrero de 2014) - última versión en 2011, último cambio en verano de 2013

Compilador PHP Roadsend

bcompiler

  • Extensión PECL de PHP
  • experimental
  • compila en código de bytes PHP, pero puede incluirlo en el binario de Windows que carga el intérprete PHP (consulte el bcompiler_write_exe_footer()manual )
  • parece descontinuado ahora (febrero de 2014) - último cambio en 2011

Proyecto cero

  • Wikipedia , IBM
  • incubadora de cambios para WebSphere sMash
  • apoyado por IBM
  • compila a bytecode de Java
  • parece descontinuado ahora (febrero de 2014) - sitio web caído, parece una gran exageración en 2008 y 2009

Bambalam

  • compila a binarios de Windows independientes
  • los binarios contienen bytecode y un lanzador
  • parece descontinuado ahora (febrero de 2014) - último cambio en 2006

BinaryPHP

  • compila a C ++
  • parece descontinuado ahora (febrero de 2014) - último cambio en 2003
Frank Farmer
fuente
¿Qué pasa con el servidor web compartido? ¿Podría compilar mi script PHP con uno de esos compiladores y luego subirlo a mi servidor web basado en Linux?
SaidbakR
2
@ sємsєм depende de tu host, pero si tuviera que adivinar, supongo que muchos hosts no lo permitirían.
Frank Farmer
2
Ninguno de los proyectos anteriores parece mantenerse más. ¿Existe un compilador generalmente aceptado desde los últimos 2 años o por qué todos esos proyectos son ignorados / abandonados?
Preexo
Una buena lista de compiladores PHP está en thefreecountry.com. Todas las herramientas mencionadas allí están incluidas en esta respuesta ahora.
Palec
1
Como todo esto parece muerto, la respuesta parece ser "no".
Ira Baxter
22

La respuesta corta es no".

La implementación actual de PHP es la de un lenguaje interpretado. Puede discutir los aspectos teóricos del hecho de que cualquier lenguaje puede ser técnicamente interpretado o compilado, pero tal como está, las implementaciones actuales son tales que el código PHP requiere un intérprete para ejecutarse, y el intérprete administra el entorno de ejecución.

Para responder a su pregunta sobre la carga de un código de bytes PHP precompilado, probablemente sea posible, pero tendría que implementar una forma para que el intérprete de PHP lea dicho archivo y trabaje con él. Con los cachés de código de operación existentes, ya no parece una tarea que coseche mucha recompensa.

zombat
fuente
3
Es frecuente que necesite un intérprete para ejecutar correctamente los programas PHP, pero eso no significa que un compilador no pueda proporcionarlo en el código compilado. phc (phpcompiler.org) maneja todos los problemas que describe. Que yo sepa, Roadsend (roadsend.com) también lo hace.
Paul Biggar
28
Esta respuesta no está actualizada: HipHop se lanzó 6 meses después de su publicación, en febrero de 2010.
Frank Farmer,
1
@FrankFarmer ¿Has tenido alguna experiencia con HipHop? ¿HipHop funciona correctamente con includey require? Por ejemplo, si generalmente se incluye un script PHP, ¿ include( 'controller/' . $controller_name . '.php' )funcionará automáticamente con HipHop? aplausos
Lea Hayes
2
En realidad, puede compilar código PHP, utilizando compiladores PHP normales. Solo depende de la plataforma de destino; puede compilar en Zend opcode, lenguaje C o en ensamblados .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…No hay nada teórico al respecto, muchos lenguajes interpretados tienen compiladores; a saber, AutoIt / AutoHotkey, o incluso desde BASIC. Hay muchos programas que han sido escritos en ellos, luego compilados para su uso por el público como programas independientes. PHP no tiene nada de especial para evitar que sea compilable, por eso existen muchos compiladores, pero a diferencia de AHK, no hay un compilador oficial, probado, Zend Guard no cuenta.
Synetech
16

Desde que se hizo la pregunta por primera vez, ha habido un cambio en esa respuesta de un rotundo "no" a un "tipo de"

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

Hip Hop for PHP fue un compilador que tomó el código PHP y lo convirtió en C ++ altamente optimizado Aparentemente, algunas funciones no son compatibles (por ejemplo, 'explotar')

Encontré esta pregunta mientras buscaba más información sobre cómo implementar HipHop y pensé en hablar :)

Sin embargo, desde 2013 Facebook ya no lo usa, y se ha descontinuado a favor de HHVM, que no es un compilador: https://en.wikipedia.org/wiki/HipHop_for_PHP

Alex C
fuente
3
creo que esto es lo que usa Facebook
Richard H
El "tipo de" yace unos años atrás y dado que HHVM (HipHop Php) está mejorando cada vez más, finalmente hay una manera (creo). Usando HHVM hoy en día es posible pre-analyzeel código php. Como resultado, obtienes un archivo de caché binario. Con este archivo y la configuración correcta de HHVM, es posible ejecutar una página web solo con bytecode, ya no se necesitan los archivos fuente;) <br> Espero haberlo hecho bien.
PKeidel
@Andrea, ¿qué quieres decir con HHVM en desuso? Parece mantenido y vivo como un proyecto. ¿O quiere decir que el nombre cambió de Hip Hop para PHP a HHVM? Entonces hablar de desaprobación es engañoso.
Palec
1
@Palec HipHop para PHP fue descontinuado. Fue un compilador de PHP a C ++ que Facebook usó, pero produjo una producción difícil de manejar (binarios de varios GB) y no pudo soportar el lenguaje completo. HHVM es un proyecto sucesor que comparte parte del mismo código, pero no es un compilador. HHVM es una máquina virtual. Facebook ya no es compatible con HipHop.
Andrea
11

También hay

cuales objetivos

  • Para codificar un script completo en una aplicación PHP propietaria
  • Para codificar algunas clases y / o funciones en una aplicación PHP propietaria
  • Para habilitar la producción de aplicaciones php-gtk que podrían usarse en escritorios de clientes, sin la necesidad de un php.exe.
  • Para hacer el estudio de viabilidad de un convertidor PHP a C

La extensión está disponible desde PECL.

Gordon
fuente
8

phc le permite compilar programas PHP en bibliotecas compartidas, que pueden cargarse en el servidor. El programa PHP se compila en binarios. Está hecho de tal manera que admite evals, includesy toda la biblioteca estándar de PHP.

Paul Biggar
fuente
8

Si simplemente está buscando producir un ejecutable binario a partir de un script PHP, evite tratar de hacer su pregunta extremadamente precisa porque hará que parezca que sabe exactamente lo que necesita. Además, la mayoría de los desarrolladores de PHP no tienen ni idea de qué es un bytecode.

Dicho esto, las respuestas son . Acabo de terminar de compilar un script PHP en un binario. Y no cualquier binario cualquiera. He usado la aplicación CDE (enlace a Wayback Machine, el enlace original ahora está roto) para convertirlo en un binario portátil que puede distribuirse con todas las dependencias y ejecutarse sin ningún problema ... y funciona de maravilla.

Todo lo que necesitas es usar phc .

asiby
fuente
7

Um, alguien ha oído hablar de Zend Guard , que hace exactamente lo que esta persona está pidiendo. Codifica / ofusca el código PHP en "código máquina".

John Dillick
fuente
1
No creo que quisieran ofuscarse tanto como las aceleraciones resultantes de la interacción del código de bytes en lugar de la fuente.
Stephen
@Stephen Zend Guard está destinado a hacer eso también.
Gajus
Zend Guard decidió no apoyar PHP 7, que es inconveniente - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj
2

Hay varios "compiladores" de código PHP. La mayoría de ellos no son compatibles con todas las funciones de PHP, ya que estas simplemente deben interpretarse durante el tiempo de ejecución.

Estamos usando Phalanger - http://www.php-compiler.net/ - que es compatible incluso con esas características dinámicas PHP sucias, y aún es capaz de compilarlas como ensamblado .NET, que se puede distribuir como una DLL independiente.

Jakub Míšek
fuente
1

En php 7 existe la opción php ini opcache.file_cache que guarda el bytecode en una carpeta específica. In podría ser útil para php cli script que se "compila" y se guarda en una carpeta específica para una reutilización optimizada.

Opcache no está compilando pero es algo similar.

caiofior
fuente
"En php 7" no es solo PHP7, es PHP 5.5.0 y posterior
Raymond Nijland
0

PHP realmente no se compila como con muchos programas. Sin embargo, puede usar el codificador de Zend para que sea ilegible.

Joe
fuente
¿No se compila de la misma manera que se compila Perl?
Carson Myers
PHP está compilado en el servidor sobre la marcha, creo. Sin embargo, he usado un codificador para ocultar el código fuente. Si eso es lo que te preocupa. Funcionan muy bien.
Joe
Nah, sólo estaba interesado en el aspecto teórico de la misma
Carson Myers
2
PHP no se cumple, es un lenguaje interpretado. el caché contiene 'códigos de operación' que php interpreta (sin tener que leer el texto), el código php no se puede 'ejecutar' directamente como lo haría con c
borrel
0

Si puede ejecutar binarios nativos reales, entonces este es su compilador:

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

¡Es un compilador PHP escrito en PHP!

Compila el código PHP en su propio código VM. Este código VM puede ser interpretado por su propio intérprete (también escrito en PHP, ¿no es una locura?) O puede traducirse a Bitcode. Y utilizando el marco de compilación LLVM ( clangy co), este Bitcode se puede compilar en un binario nativo para cualquier plataforma que soporte LLVM (prácticamente cualquier plataforma que sea importante hoy en día). Puede elegir hacerlo estáticamente o cada vez justo antes de ejecutar el código (estilo JIT). Entonces, los únicos dos requisitos para que este compilador funcione en su sistema es un intérprete PHP instalado y un clangcompilador instalado .

Si no se le permite ejecutar binarios nativos, puede usar el compilador anterior como intérprete y dejar que interprete su propio código VM, sin embargo, esto será lento ya que está ejecutando un intérprete PHP que se ejecuta en un motor PHP, por lo que tienes una "doble interpretación".

Mecki
fuente