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?
Respuestas:
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 compiler
una serie de soluciones de terceros.Melocotón
Falangero
phc
Compilador PHP Roadsend
bcompiler
bcompiler_write_exe_footer()
manual )Proyecto cero
Bambalam
BinaryPHP
fuente
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.
fuente
include
yrequire
? Por ejemplo, si generalmente se incluye un script PHP, ¿include( 'controller/' . $controller_name . '.php' )
funcionará automáticamente con HipHop? aplausosThe 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.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
fuente
pre-analyze
el 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.También hay
cuales objetivos
La extensión está disponible desde PECL.
fuente
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
eval
s,include
sy toda la biblioteca estándar de PHP.fuente
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 SÍ . 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 .
fuente
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".
fuente
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.
fuente
vea 5.5.x con el módulo OPcache integrado, volátil en una memoria compartida, mucho más rendimiento y el principio de dinamismo de php permanecen intactos.
http://www.php.net/manual/en/opcache.installation.php
fuente
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.
fuente
PHP realmente no se compila como con muchos programas. Sin embargo, puede usar el codificador de Zend para que sea ilegible.
fuente
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 (
clang
y 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 unclang
compilador 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".
fuente
También hay bcgen (un puerto PHP7 de bcompiler):
https://github.com/vjardin/bcgen/
(Solo PHP7.2)
fuente