Compiladores PHP gratuitos para componer código nativo, scripts de código de bytes .NET o Java. Cómo se ejecuta el script en sí

Alexey Romanenko: Mi nombre es Alexey Romanenko, trabajo en RBC. El tema de este informe es algo controvertido. Al parecer, ¿por qué compilar scripts PHP cuando todo parece funcionar así?

Probablemente la pregunta principal sea: "¿Por qué?" En general, el objetivo de esta presentación es intentar comprender si dicha recopilación es necesaria y, de ser así, por qué, en qué forma y para quién.

¿Qué es un compilador PHP?

Para empezar breve reseña Qué es un compilador PHP. Te cuento cómo funciona, qué es y cómo puedes acelerarlo.

El primer módulo funcional es el llamado SAPI (Server API), que proporciona una interfaz para acceder a PHP desde varios clientes(Apache, algunos servidor CGI(Interfaz de puerta de enlace común) y otros). También hay SAPI integrado, que le permite integrar PHP en cualquier aplicación.

La segunda parte principal es PHP Core, que procesa solicitudes, implementa todo el trabajo con la red, sistema de archivos y analizar los propios guiones.

La tercera parte global es Zend Engine, que compila nuestros scripts en algún código de bytes, los ejecuta en su máquina virtual y maneja la administración de la memoria (implementa asignadores integrales).

Uno de los más importantes y piezas grandes es un módulo de extensiones que implementa el 99% de lo que usamos en PHP. Estos son "envoltorios" para algunas bibliotecas, funcionalidades, clases, bibliotecas integradas, etc. También podemos escribir nuestras propias extensiones.

¿Cómo se ejecuta el script en sí?

Primero. Se produce un análisis léxico: el archivo se descarga, se analiza, todos los caracteres del conjunto de este archivo se traducen en un determinado conjunto de tokens, con los que luego trabajamos.

En fase analizando Estos tokens son analizados. A partir de este análisis se elabora una estructura gramatical determinada, a partir de la cual se generará el código de bytes.

Al final, Zend Engine lo ejecuta. El resultado se devuelve al cliente.

estamos hablando de cargas altas. Si repites este patrón de acciones cada vez, todo funcionará muy lentamente. Cuando nuestro intérprete recibe varios cientos o miles de solicitudes al mismo tiempo, la velocidad es simplemente inexistente.

Pero hay soluciones. Se conocen desde hace mucho tiempo.

¿Cómo lograr la aceleración?

La solución más sencilla, económica y probada es el almacenamiento en caché de código de bytes. En lugar de pasar por la fase de análisis, simplemente almacenamos en caché nuestro código de bytes. Para esto hay extensiones especiales, son bien conocidos por todos los que han trabajado con PHP: son APC, eAccelerator, Xcache, etc. Zend Engine simplemente ejecuta el código de bytes.

La segunda opción es la creación de perfiles de código, identificando cuellos de botella. Podemos reescribir algo como extensiones PHP (esta será una extensión en C/C++), compilarlo y usarlo como módulos.

La tercera opción es más global: olvídate de PHP y reescribe todo. En general, esta opción tiene derecho a vivir, pero solo en el caso de que no haya suficiente código PHP. en grande grandes proyectos(o que existen bastante por mucho tiempo) Por lo general, se acumula mucho y llevará mucho tiempo reescribirlo todo. Los requisitos comerciales no le permitirán hacer esto. En general, escribir algo en PHP, por ejemplo, para un servidor front-end, no lleva mucho tiempo, porque es un lenguaje sencillo. Le permite hacer rápidamente cosas que llevan más tiempo en lenguajes de bajo nivel.

También hay opción alternativa, que en últimamente se ha generalizado, es compilar PHP en algún lugar, en algo más rápido.

¿Vamos a compilar algo?

Por la palabra "compilación" me refiero a la traducción del código del script PHP a otra cosa, a algún otro código.

EN en este caso puede ser de dos tipos.

El código nativo es cierto. archivo binario, que se puede ejecutar en una máquina física.

Código no nativo. Puede compilar algún código de bytes que se pueda ejecutar en otra máquina virtual, por ejemplo, en la JVM.

¿Cómo se puede compilar código nativo desde PHP?

Compilador de Roadsend. Su secuela es Cuervo. También hay PHC (esto es PHP Código abierto compilador). Recientemente también ha aparecido HipHop (Facebook).

Daré una breve descripción general de lo que se puede hacer con el código no nativo. Hasta donde yo sé, hay 3 opciones de trabajo. Esta es la generación de código de bytes para Java y la generación de código de bytes para .Net: Quercus, Project Zero, Phalanger. No consideraré la compilación en código no nativo porque no lo usamos. Volvamos a la compilación en código nativo.

En mi opinión, el compilador más antiguo es Roadsend. Comenzó a desarrollarse hace bastante tiempo, en 2002. Originalmente era una aplicación comercial. Se cerró, recién en 2007 se lanzó en código abierto. hay muy circuito complejo compilación: se utiliza un determinado compilador Bigloo para lenguaje de esquema, después de lo cual se genera el código nativo. Este compilador no utiliza Zend Engine.

Podemos generar un binario ejecutable por separado o generar un módulo para Apache. También es posible generar un binario que funcionará como servidor web. Pero no funciona. No sé por qué, pero no me funciona en absoluto.

Hasta donde yo sé, actualmente no se están realizando trabajos en Roadsend. Evolucionó hasta convertirse en el proyecto Raven, que fue completamente reescrito en C++. Como compilador, utiliza LLVM para generar código.

En en este momento Todo parece muy prometedor.

Pero todavía está en construcción. Incluso en la documentación hay indicios de que no generaremos archivos binarios. Esperar.

Las cosas serían tristes si no tuviéramos APS. Este es un compilador OpenSource. Ha sido desarrollado desde 2005. Una de sus desventajas: utiliza SAPI integrado. No estamos abandonando la máquina Java, el Zend Engine. Básicamente, traduce el código PHP al código del módulo de extensión PHP. Después de eso, se compila, pero el proceso de ejecución, nuevamente, involucra al motor Zend.

Ejemplo de uso de APS

Muy similar a cómo trabajamos, por ejemplo, con los compiladores convencionales, gcc. El primero muestra que hay un binario, también podemos simplemente generar el código C. Dado que el mismo gcc se usa internamente después de generar este código, podemos usar aquellos indicadores que están destinados a la optimización y otras cosas.

Estábamos hablando de una aplicación que se ejecuta en la línea de comandos.

Para iniciar una aplicación web es necesario realizar varios pasos, es bastante complejo. Primero necesita generar una extensión, luego compilar el código y luego conectarlo de alguna manera (ya sea dinámica o estáticamente).

Beneficios clave de la APS

Básicamente, utilizamos el mismo PHP, somos totalmente compatibles. Todas las demás extensiones son compatibles. Usamos todo lo que hemos compilado. Bastante buena documentación.

Por cierto, uno de bonos adicionales PHC: es posible generar el funcionamiento XML de nuestro script en función de cómo se construye XML, a veces esto puede resultar útil.

Contras

En mi opinión, este es un binario inferior, porque todavía depende de Zend Engine. También existe cierta complejidad en términos de conectar proyectos web.

Sobre lo principal

Este informe probablemente no habría sucedido si HipHop, una solución de Facebook, no hubiera aparecido. Sus creadores también acumularon una gran cantidad de código PHP y pensaron durante mucho tiempo qué hacer con él.

Según tengo entendido, después de que se rechazaron las opciones para reescribir todo, se decidió escribir algún tipo de traductor (en este caso en código C++). El proyecto es relativamente joven; no se lanzó oficialmente hasta febrero de este año. El código PHP se traduce a código C++ y luego se genera medios estándar su sistema operativo. Es cierto, hasta ahora sólo se admite Sistema operativo Linux.

Ayer mismo le pregunté a un representante de Facebook sobre esta decisión. Dijo que actualmente el 100% del código PHP se compila a través de HipHop. EN forma pura El código no funciona a través del intérprete PHP. Una vez más, los creadores anunciaron una reducción significativa en la carga del procesador.

Funcionalidad básica de HipHop

Genera directamente el binario, que se puede ejecutar en la línea de comando. Existe una opción para iniciarlo como un servidor web de transmisión. También hay un depurador integrado independiente. Puede depurar scripts tanto local como remotamente (funcionará como servidor).

El proceso de montaje no es nada trivial. Hay una descripción, pero no está recogida en todas partes. Por el momento, como dije, todo está ensamblado para Linux, además inicialmente todo fue "adaptado" para 64 bits. Aunque ahora se admiten experimentalmente 32 bits. Pero logré ensamblarlo y parchearlo un poco; en general, hizo todo esto porque no está ensamblado de forma predeterminada.

Además, tienen sus propias versiones de libcore y, en mi opinión, hay un par de bibliotecas que también necesitan ser parcheadas. En general, el proceso de montaje no es tan sencillo.

En la salida después del ensamblaje, recibimos un determinado archivo hphp, que es un traductor de nuestro código PHP a C++. Si nos fijamos en las banderas, hay bastantes. He resaltado aquí algunos básicos que puede necesitar.

Como archivo de configuración(config) podemos usar el archivo HDF especificando varias directivas. Podemos establecer el nivel de error y otras cosas allí (HDF es todo lo que está disponible en forma estructurada). También podemos tomar la configuración de la base de datos o usarla directamente en la línea de comando.

Configuramos el nivel de registro durante la compilación: mostrar todos los errores o también mostrar advertencias, información adicional o, en general, llevar un registro completo de todo lo que sucede.

Una directiva muy útil es input_list=FILE, que nos permite especificar una lista de scripts que queremos compilar. También vale la pena mencionar una directiva como lazy-bind. Podemos especificar todos los archivos del proyecto, aquellos que se compilarán.

Ejemplo de ejecución de compilación de script PHP

Se ha instalado el tercer nivel de registro, es bastante información general Por tiempo, puedes ver cuánto tiempo tomó algo. De hecho, el guión es bastante sencillo. Este es el habitual "Hola mundo", acabo de tomar una captura de pantalla.

El archivo más pesado es nuestro binario "programa", su tamaño es de 28 MB. Básicamente, nuestro "Hola, mundo" pesa 28 MB. Quería señalar que, además de la línea estándar "Echo "¡Hola, mundo!", este binario incluye mucho más. Este es un servidor web completo, un servidor completo para administración.

¿Qué estamos haciendo?

Tenemos "Hola..." en C++, que realiza una función que consta de una línea "echo" Hola, mundo. Además, se cargan muchas cosas de terceros. Como podemos ver, este es un archivo completo. en C++.

Este es el programa resultante. Ya contiene bastantes claves diferentes para diferentes configuraciones, pero solo mencionaré algunas de ellas.

Este es --mode, este es el modo de inicio de nuestro programa. Podemos ejecutarlo directamente (desde la línea de comandos) o en un servidor web o en modo demonio completo. Hay un par de opciones más, pero no son importantes.

config se utiliza en el mismo formato. No di directivas porque hay muchas. HipHop viene con documentación. No está en el sitio wiki, pero se proporciona documentación con la distribución, donde todo se describe claramente. Ni siquiera esperaba que la descripción fuera tan detallada. Esto le permite configurar la solución de manera bastante flexible.

Para ejecutar en modo servidor, podemos especificar el puerto. Para la administración, se utiliza un puerto separado, donde puede enviar algunas solicitudes que le permiten administrar el servidor. Si tenemos un servidor de depuración en ejecución, entonces indicamos el host y el puerto donde nos “vincularemos” para la depuración.

Ejemplo de lanzamiento

Por ejemplo, especificamos el puerto 9999 para la transmisión mediante ejecución. solicitudes http simples, podemos recibir estadísticas, administrar de alguna manera el servidor o recibir información adicional. En general es muy cómodo.

Opción para obtener información de estado.

Es posible recibir el estado del servidor configurado en varios formatos integrados (xml, json, html). Básicamente, se proporciona información sobre el proceso maestro del servidor y los controladores: subprocesos que procesan las solicitudes.

Estadísticas adicionales

De hecho, se proporcionan muchas estadísticas. Dado que HipHop funciona de forma nativa con Memcache y SQL en forma de MySQL, proporciona información detallada para todas las operaciones que se realicen con él.

Estadísticas completas de memoria.

es muy característica útil- Estadísticas de la aplicación. Usando características adicionales HipHop en PHP, podemos escribir estadísticas en nuestros scripts, que luego recibimos a través del acceso regular en http.

Depuración

Como ya dije, es posible utilizar la "depuración" incorporada para depurar scripts. Esto es muy conveniente porque el intérprete hphpi funciona de manera similar a lo que hemos compilado. Existe una diferencia en el "comportamiento" de los scripts cuando se ejecutan en PHP estándar y cuando se utilizan algunos datos compilados. Para depurar lo compilado, Facebook escribió un intérprete separado.

En el primer caso, ejecutamos el código con el modificador “-f” y vemos cómo se comporta el archivo; toda la salida va a la salida estándar. O podemos ejecutarlo en modo de depuración y acceder al depurador interactivo. Es muy similar al GDB estándar: también puede establecer puntos de interrupción, ejecutar, ingresar valores de variables, realizar un seguimiento y más.

uno de características adicionales

Tenemos un programa que resultó después de la compilación. Se puede utilizar como servidor RPC. Ejecutamos solicitudes a través de http y, al llamar a la función params, podemos pasar un parámetro como una matriz json o como un parámetro separado. Tendremos devuelto json, que devuelve los resultados de estas funciones. Esto es muy conveniente: la funcionalidad necesaria ya está integrada desde el principio.

Contras del hip hop

Por el momento, HipHop no admite construcciones de lenguaje ni funciones como eval(), create_function() y preg_replace() con /e, aunque todas ellas son análogas a eval(). Sin embargo, en las últimas versiones, en mi opinión, aún puedes habilitar eval() a través de config. Pero no se recomienda hacer esto. En general, usar eval() es malo.

Las principales ventajas del HipHop.

Por supuesto, la principal ventaja es el soporte de Facebook. Funciona y se está desarrollando de forma bastante activa. Una comunidad de desarrolladores está surgiendo en torno a este proyecto. Completamente escrito nueva implementación PHP.

Como ya dije, la ventaja es que se genera código nativo. Se afirma un aumento del rendimiento al reducir los costes de carga del procesador (las pruebas lo confirman).

Es bastante flexible en configuración. Me sorprendió gratamente que haya bastantes opciones de personalización. Creo que esto se debe al hecho de que el proyecto realmente funciona. Todo lo que se utiliza se incrementa.

Como ya mencioné, HipHop ofrece muchas funciones adicionales. Estos incluyen el uso como servidor RPC, administración, diversas estadísticas y mucho más. Por cierto, también existe una API para trabajar con otros idiomas.

Se ha escrito bastante buena documentación para esta solución. Otra ventaja: se trata de una solución que realmente está lista para su uso en producción (ejemplo: Facebook).

Contras

La principal desventaja es que actualmente se admite un número bastante limitado de módulos. Por ejemplo, cuando trabajamos con una base de datos, solo podemos usar funciones para trabajar con MySQL. Aquí no hay soporte para PostgreSQL.

También existe la complejidad del montaje, que ya mencioné. Hay problemas al construir en sistemas de 32 bits. Pero creo que esto se solucionará pronto. Por ahora, sólo se utiliza la compilación de PHP 5.2. La versión 5.3 aún no es compatible, pero lo será según lo prometido.

¿Qué no deberías esperar del recopilatorio en general y del HipHop en particular?

La compilación de ninguna manera acelerará sus consultas SQL lentas en la base de datos. Si el cuello de botella es la base de datos, compílela o no la compile, no servirá de nada.

La compilación no acelera la carga estática, solo la carga dinámica. Hace que la depuración sea mucho más difícil. Probablemente mucha gente esté acostumbrada al hecho de que todo es bastante fácil de depurar en PHP. Esto ya no sucederá durante la compilación. Aunque, como señalé, Facebook ha hecho que este proceso sea lo más fácil posible, sin él sería aún más difícil de compilar cada vez.

No espere que esto sea una especie de “solución milagrosa” que resuelva todos sus problemas. De hecho, la compilación resuelve una gama bastante limitada de problemas. Si es así, entonces esto puede ayudar.

¿Qué problemas resuelve la compilación?

Reduce la carga en la CPU, desde cuando trabajo activo Con PHP, cuando hay una gran cantidad de solicitudes, la carga aumenta significativamente. Por supuesto, me gustaría realizar algunas pruebas.

Pruebas

La primera prueba (la más sencilla) es una operación bastante costosa y que lleva bastante tiempo completarla. En las pruebas intenté abstraerme y no realizar solicitudes utilizando algún recurso externo.

La carga recae enteramente sobre el procesador. La prueba mostró que HipHop "ganó" a todos: funciona casi una vez y media más rápido que el compilador PHP estándar. PHC pasó esta prueba muy lentamente.

Para la segunda prueba de rendimiento que tomé guión oficial en PHP, que se puede descargar desde SVN. Realiza una serie de funciones que realizan clasificación, asignación y suma, operaciones bastante costosas desde un punto de vista matemático.

El hiphop volvió a estar por delante. y con estándar diferencia PHP aproximadamente 3 veces en el tiempo. PHC tuvo un mejor desempeño aquí, pero fue aproximadamente la mitad de malo que HipHop.

PHP se utiliza principalmente para subprocesos que manejan solicitudes http; vale la pena tener esto en cuenta.

Alguno configuraciones estándar(Apache con PHP, Nginx con fpm-php y complemento APC para almacenamiento en caché de código). Como quinta opción - HipHop.

Para ser honesto, las pruebas no las realicé en el servidor, sino en una computadora portátil. Las cifras, por supuesto, pueden no corresponderse completamente con la realidad, pero en este caso los resultados son normales. Vale la pena señalar que a medida que aumenta la carga, aumenta simultáneamente el número de solicitudes y el número total de solicitudes. El siguiente es RPS. Se probó una página estándar, que incluye 10 inclusiones simples. Esencialmente esto es Pruebas de PHP como intérprete.

Pregunta de la audiencia:¿Cuáles son los números en la celda - segundos?

Alexey Romanenko: Esto es fps.

Aquí podemos concluir que a medida que aumenta el número de solicitudes simultáneas, HipHop se comporta muy bien.

Se puede ver que el uso de APC es una práctica estándar. Muestra que añade, por ejemplo, como Apache un aumento de rendimiento de aproximadamente 2 veces. Esto también sucede con Nginx. Pero el hecho de que Nginx sea lento no significa que esta combinación sea peor. Sólo una prueba específica. Si realmente probamos aquí, entonces Apache "morirá" ante solicitudes lentas.

Probablemente queramos entender si lo necesitamos o no.

¿Cuándo deberías pensar en la compilación?

Lo más probable es que esto sea necesario cuando vemos que nuestro cuello de botella es la CPU. Si estamos limitados a la CPU y utilizamos PHP como intérprete estándar, probablemente valga la pena considerar que tal vez se pueda compilar parte del proyecto.

En algunos casos, cuando su aplicación necesita autonomía para ejecutarse, es poco probable que este método sea adecuado.

Reducir el número de servidores. Cuando hay muchos servidores, al reducir la productividad 2 veces, en términos generales, también reducimos el número a la mitad. Cuando se trata de un servidor, no tiene sentido, pero cuando hay entre 100 y 200, probablemente tenga sentido.

La razón principal por la que Facebook comenzó a usar HipHop es porque tiene grandes volúmenes Código PHP que no se puede reescribir (o no hay nadie, o simplemente es caro). Aumentar la productividad 2 veces ya es bueno.

Probablemente todo. Estoy esperando preguntas.

Preguntas y respuestas

Pregunta de la audiencia: Hola. Por favor, dígame si tiene otros ejemplos de implementaciones exitosas de Hiphop, además de Facebook. ¿Le gustaría transferir el sitio web de RBC, por ejemplo, a HipHop? Alexey Romanenko: Empezaré por el segundo. El sitio web de RBC es difícil de traducir. Respecto a la implementación exitosa. Yo mismo compilé PHP Unit y se compiló correctamente. Además, hasta donde yo sé, el tablero PHP Bunty se compila correctamente. De hecho, varias organizaciones ya utilizan la compilación. Otras pruebas mostrarán hasta qué punto está justificado utilizar este proyecto. Pregunta de la audiencia:¿Puedes dar un ejemplo de una organización que lo utilice? Alexey Romanenko: Honestamente, no te lo diré ahora, pero esto es Occidente. Hasta donde yo sé, nadie lo usa aquí. Pregunta de la audiencia:¿Cuál es la diferencia en tiempo de ejecución además de la falta de soporte para algunas de las funciones que mencionaste? ¿Qué tan peligroso es traducir un proyecto “en vivo”? Alexey Romanenko: La diferencia es que cualquier programa compilado puede fallar. Quizás aparezcan algunos problemas que aún no han sido identificados. De hecho, existen varias diferencias en el "comportamiento" del propio PHP. No los incluí porque se puede encontrar información más detallada en la documentación. El equipo de Facebook ha escrito su propio intérprete, que de hecho es equivalente en un 99,9% al que funcionará en forma compilada. Es mejor probar su código no con un intérprete PHP estándar, sino, como dije, con hphpi para PHP.

Casi todos los desarrolladores, tarde o temprano, se enfrentan a la necesidad de ejecutar o comprobar rápidamente algún código, pero no todo el mundo sabe que para una tarea tan sencilla no es necesario ejecutar IDE de escritorio pesados ​​o compiladores de aplicaciones. Basta con utilizar herramientas en línea que le permitirán hacer todo mucho más rápido: Ctrl+C, Ctrl+V, Ejecutar, golpear, y la salida del programa ya estará ante sus ojos rojizos.

Hemos seleccionado los mejores compiladores en línea: algunos de ellos son bastante universales, otros están diseñados para tareas estrictamente definidas. En cualquier caso, no serán superfluos.

Codificación

Koding.com no es un compilador en línea en el sentido tradicional. Cada usuario del servicio puede crear varias máquinas virtuales completas en la nube bajo gestión de ubuntu 14.04, en el que puede hacer lo que quiera, incluso compilar el código. Todo idiomas populares son compatibles de forma predeterminada, pero puedes agregar fácilmente los tuyos propios.

Además del panel de control de su servidor, en la interfaz están disponibles un práctico IDE y una ventana de terminal. Codificar es lo más remedio universal, luego veremos opciones más simples y especializadas.

Idea uno

IdeOne es una herramienta de depuración y compilador en línea que le permite ejecutar código en más de 60 lenguajes de programación y sus versiones específicas directamente en el navegador.

Para aquellos que no tienen novia, los creadores han proporcionado una compilación de código en el lenguaje Brainfuck.

JDoodle

Otro compilador en línea que admite muchos idiomas, incluidos algunos que no encontrará en muchos otros compiladores en línea. Una buena característica de JDoodle es la capacidad colaboración- ¡simplemente envíe un enlace a su sesión actual y genere errores al doble de velocidad!

jsFiddle

No dejes que el nombre te engañe: jsFiddle no está diseñado solo para JavaScript. Este editor front-end en línea le permite probar cualquier combinación de JavaScript, HTML y CSS. Por supuesto, hay soporte para varios frameworks, por ejemplo, jQuery, Vue, React, TypeScript, así como preprocesadores CSS como SCSS. Para mayor comodidad, puede seleccionar una combinación de teclas de su editor favorito. Es cierto, sólo si tu editor favorito es Vim, Emacs o Sublime Text.

Teclado

CodePad es un servicio minimalista en el que puede almacenar código, compartirlo y ejecutarlo con la posterior salida de los resultados de su ejecución. Hay varios de los idiomas más comunes para elegir, pero lamentablemente no hay otra opción. versiones específicas intérpretes o compiladores.

Su principal ventaja es la simplicidad y facilidad: el sitio funcionará rápidamente incluso con internet lento. Se proporciona conexión automática de encabezados estándar, así como integración con Vim o Emacs.

Entre las desventajas podemos nombrar ausencia total resaltado de sintaxis al ingresar código en el formulario. Sin embargo, cuando se ve una grabación ya guardada, la luz de fondo está presente.

Rayo divino del CCG

GCC GodBolt es un compilador interactivo de C++. Entré en esta colección porque tiene una interfaz simple, además de gran número configuraciones, incluidas opciones que se pueden ajustar mediante teclas.

Hay muchas versiones de compiladores para elegir, incluidas las más recientes. De características interesantes Puede observar la traducción instantánea del código del programa al lenguaje ensamblador.

PHP es un lenguaje de programación interpretado, cada solicitud es analizada y “ejecutada” código fuente. Este enfoque, por supuesto, es muy conveniente en la etapa de desarrollo del proyecto, pero introduce un paso adicional en el proceso de ejecución del código de producción. Por lo tanto, la interpretación, que a primera vista es el punto fuerte de PHP, cuesta tiempo y recursos adicionales de la CPU.

A continuación hablaremos sobre compiladores que le permiten compilar. codigo php en C++, y está en el ejecutable. Por tanto, las aplicaciones PHP son ejecutadas directamente por el procesador, sin pasar por el intérprete.

Comprobemos si todo va tan bien en la práctica.

Cómo funciona el intérprete

La interpretación del código PHP se realiza en dos etapas:

  1. Análisis de código y generación de códigos de operación (códigos de operación Zend): instrucciones comprensibles para el intérprete.
  2. Ejecución de códigos de operación.

Mientras que la primera fase se presta bien a la optimización (utilizando un caché de código de operación), la segunda es bastante cerrada: el intérprete es siempre un intermediario entre el conjunto de instrucciones y el procesador que las ejecuta. Sin un intérprete, el procesador no puede entender qué hacer con los códigos de operación.

Para deshacerse del enlace del intérprete, se inventaron compiladores, el más popular y reciente de los cuales es HipHop de Facebook. Sintámoslo más cerca.

Hip Hop PHP

HipHop está escrito por desarrolladores de Facebook y es una aplicación que:
  1. optimiza el código PHP
  2. se convierte a C++
  3. genera desde su aplicación un servidor web multiproceso que la ejecuta
  4. compila a código ejecutable usando g++

Así sucesivamente entrada PHP código, la salida es un servidor, parte del cual es la funcionalidad escrita.

Veamos cómo HipHop puede manejar la compilación de una aplicación escrita usando un marco, como Wordpress.

Compilando Wordpress

Después de instalar HipHop, en la carpeta src/hphp/ obtendremos el archivo hphp, que es el compilador. Antes de que comience la compilación, configure las variables de entorno:

Cd .. # vaya a la carpeta con hiphop export HPHP_HOME=`pwd` export HPHP_LIB=`pwd`/bin export CMAKE_PREFIX_PATH=`/bin/pwd`/../

¡y adelante!

Descarga Wordpress y descomprime el archivo:

Wget http://wordpress.org/latest.tar.gz tar zxvf last.tar.gz

Copie wp-config-sample.php a wp-config.php y especifique la configuración para conectarse a la base de datos (en la configuración del host especificamos 127.0.0.1, no localhost).

Para una compilación exitosa, necesita parchear un poco Wordpress:

  1. Abra wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php y reemplace: function &loopback(/* args.. */) ( return func_get_args(); ) con function &loopback(/* args.. */ ) ( $ret = func_get_args(); devolver $ret; )
  2. En wp-includes/query.php, en lugar de if (!isset($q["suppress_filters"])) $q["suppress_filters"] = false; insertar $q["suppress_filters"] = verdadero;

WordPress está listo.

Hiphop necesita especificar la lista de archivos que compilaremos; la obtendremos y la guardaremos en files.list:

Encontrar. -nombre "*.php" > archivos.lista

Todo está listo para la compilación, procedamos:

$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50

Después de completar el comando, en la carpeta temporal (al comienzo de la compilación, hphp mostrará su ruta, algo así como “/tmp/hphp_ptRgV1”) recibiremos un servidor web compilado. Iniciémoslo (si algo está colgado en el puerto 80, por ejemplo apache o nginx, primero debes detenerlo para liberar el puerto):

Sudo /tmp/hphp_6s0pzd/program -m server -v "Server.SourceRoot=`pwd`" -v "Server.DefaultDocument=index.php" -c $HPHP_HOME/bin/mime.hdf

¡Voilá! Al ir a http://localost veremos un blog de Wordpress en funcionamiento.

Actuación

Veamos si habrá un aumento en el rendimiento en comparación con la versión no compilada de WordPress que se ejecuta en apache2. A continuación se muestran gráficos de la dependencia de la velocidad de generación de páginas del número de usuarios paralelos.

Como puede ver, los resultados fueron impactantes: ¡el blog compilado se ejecuta en promedio 6 veces más rápido! ¡El número promedio de solicitudes procesadas por segundo en la versión no compilada es 9 y en la versión compilada es 50! No sé ustedes, pero estos resultados me sorprendieron; no esperaba un aumento de rendimiento tan fuerte.

resumámoslo

Después de resultados tan sorprendentes, sólo se puede decir una cosa: los chicos de Facebook hicieron un gran trabajo. El compilador realmente convierte una aplicación en un cohete y, aunque es necesario preparar la aplicación antes de compilarla, el resultado vale la pena.

Sobre el tema:

Si te gustó la publicación, haz clic en Google +1; me dará más motivación para escribir y será un placer.

Todos los compiladores PHP gratuitos presentados aquí pueden reconstruir scripts PHP V código máquina, capaz de ejecutarse en una computadora sin descargar un intérprete PHP especial, o compilarlos en una interfaz de línea de comando de código de bytes (la instalación requiere NET o Mono framework o código de bytes de Java (donde es virtual máquina java para la instalación)).

Estos compiladores pueden ser útiles para diversos propósitos: pueden acelerar la ejecución de su script porque ya no se interpretan en tiempo de ejecución; o gracias a ellos podrás distribuir tus aplicaciones sin revelar el código fuente (que otros scripts comerciales requieren). Supongo que también son adecuados en el caso de que alguien quiera escribir sobre adictos a Internet. programas PHP y distribuirlos con la función de ejecutarse en el escritorio (a diferencia de las aplicaciones web normales que se ejecutan en el servidor), todo esto es posible porque PHP es un lenguaje de programación fácil de aprender y básicamente contiene muchas funciones integradas con acceso al Internet. (En este caso, tendrá que distribuir aplicaciones con un servidor web integrado o utilizar un compilador que compile el servidor en su aplicación).

Por cierto, si desea utilizar ofuscación en su código, sepa que esto también es posible cuando usa acelerador PHP. Estos aceleradores también implican un aumento en la velocidad de ejecución de su script.

Información útil para aquellos que aún no saben qué versión oficial El traductor PHP se puede descargar desde el sitio web de PHP: Procesador de hipertexto.

Compiladores PHP gratuitos para componer código nativo, scripts de código de bytes .NET o Java.

Bambalam (nuevo)

Este programa produce independiente aplicaciones de windows EXE para su código fuente PHP. En realidad, no es un compilador de código nativo, ya que solo codifica el código fuente e incorpora un intérprete PHP, pero ciertamente es una buena opción para las personas que buscan compiladores nativos y de código de bytes. Cuando se escribió todo el programa, su entorno de ejecución era la versión integrada de PHP 4.4.4 (el programa no se había actualizado desde 2006). El código fuente de Bambalam está disponible públicamente.

Falanger (para .NET)

Phalanger compila su código PHP en código de bytes CLI (.exe o .dll). Este programa se puede ejecutar a través de frameworks .NET 4.0 o Mono. Su código PHP puede utilizar cualquier objeto .NET y bibliotecas estándar adicionales Extensiones PHP. El ensamblado NET resultante puede estar firmado u oculto. este programa También produce plantillas que le permiten crear aplicaciones PHP usando estudio visual. El programa se publica bajo la licencia Apache.

HipHop para PHP (para código nativo)

HipHop traduce su código PHP a código C++, que luego se compila usando el compilador GNU C++ en un ejecutable. código binario. El compilador soporta todas las funciones. Versiones PHP 5.3 (excepto, por supuesto, algo como evaluar()). Funciona y compila código para 64 bits. Versiones de Linux y FreeBSD. Dado que el programa se distribuye en forma de código fuente, tendrá que compilarlo manualmente (usted mismo). Se publica bajo la licencia PHP.

Roadsend PHP (para código nativo).

El compilador PHP Roadsend produce binarios nativos (ejecutables) para Windows y Linux. Sus scripts no se limitan a programas de consola ( líneas de comando): se pueden crear utilizando servidores web integrados, lo que les permite funcionar de la misma manera que funcionan en un sitio web, aunque en el suyo, por supuesto. sistema de usuario. El compilador fue lanzado bajo licencia GNU GPL y se ejecuta bajo GNU LGPL. Lamentablemente, el programa ha detenido su desarrollo activo.

Proyecto Cero (para Java)

(Nota: esto parece ser software ahora es inexistente. El sitio ha estado inaccesible durante medio año.) Project Zero incluye un compilador y CLR que puede compilar su código PHP en código de bytes Java y ejecutarlo. Tenga en cuenta que Project Zero es más que un simple compilador/tiempo de ejecución de PHP; proporciona un marco rico que le permite mejorar las aplicaciones web usando PHP o Groovy (otro lenguaje de programación). Este compilador está disponible para Windows, Mac OS X y Linux. Para trabajar con este compilador, necesitará descargar Desarrollo Java Equipo.

¿Cuál de los compiladores propuestos prefieres? ¿O tienes otro traductor favorito? Deje sus observaciones y comentarios a continuación, estaremos encantados de leerlos y aprovecharlos.

Etiquetas: Compiladores PHP, traducción de scripts




Arriba