Menú
Es gratis
registro
casa  /  Consejo/ Compiladores PHP gratuitos. Una selección de compiladores en línea: ejecutamos y probamos el código directamente en el navegador Cómo funciona el intérprete

Compiladores PHP gratuitos. Una selección de compiladores en línea: ejecutamos y probamos el código directamente en el navegador Cómo funciona el intérprete

La compilación de PHP desde la fuente se realiza con mayor frecuencia en sistemas similares a Unix. Aquellos que trabajan en un entorno de sistema operativo Windows probablemente descargarán e instalarán PHP desde paquetes binarios. Y aunque no estoy de acuerdo con que sea más fácil usar una solución precompilada, incluso en Sistemas Unix Hay algunas ventajas que pueden venir con la compilación binaria desde la fuente. En general:

  • Tienes una oportunidad sintonia FINA producto final cuando se compila. tal vez quieras extensión específica que compila directamente en binario en lugar de cargarlo como una biblioteca externa. O tal vez desee desactivar algo que es una función que suele estar disponible de forma predeterminada.
  • Puede hacer trucos durante la compilación, si es necesario, que pueden mejorar el rendimiento de su entorno particular (por supuesto, esto supone que ya sabe lo que está haciendo en este caso). no leerías este artículo !).
  • La compilación puede ser la única forma de hacer que las cosas funcionen si los archivos binarios compilados se crearon en versiones anteriores con soporte de software y biblioteca, y ahora está ejecutando en un nuevo sistema.

Advertencia: la compilación puede ser frustrante, ¡especialmente en Windows! Debe asegurarse de que el entorno de compilación esté configurado correctamente, aprender a usar el compilador y otras herramientas de compilación correctamente y satisfacer las bibliotecas de dependencia. Esperamos que este artículo sea su primer paso para superar muchos de estos obstáculos.

Configuración del entorno de construcción

PHP está escrito en C y, por lo tanto, se requiere un compilador de C si va a compilar PHP desde el código fuente. C++ es un superconjunto de C, por lo que un buen compilador de C++ debería poder compilar código C, y aunque no siempre es así. Para Windows, Visual Microsoft, C++ Express (que luego se llamará VC++) está disponible gratuitamente en el sitio web de Microsoft. Se utilizó la edición de 2010.

Al elegir una versión del compilador, debe tener en cuenta cómo ejecutará PHP. Si tiene que trabajar con mod_php, los binarios compilados oficialmente de Apache y desea compilar PHP usando Visual Studio 6, ya que esta es la versión de compilación de Apache. El módulo debe tener como destino la misma biblioteca de tiempo de ejecución que Apache, en este caso, msvcrt.dll. Si también está compilando Apache desde la fuente, o si va a ejecutar PHP como FastCGI o CLI, entonces esto no es un problema y 2010 funcionará bien.

También debe instalar software Kit de desarrollo de Windows (SDK posterior). El SDK nos brinda importantes archivos de encabezado para plataformas Windows, que necesitamos para una compilación exitosa. Esta también, se utilizó la versión 7.1.

Instale el compilador y luego el SDK. No hablaré de la instalación ya que ambos tienen un asistente de instalación gráfico que lo guiará a través de todo el proceso.

Una vez que tenga una compilación de compilador que funcione, descargue las herramientas binarias y los paquetes conocidos de windows.php.net. El paquete de herramientas binarias (estoy usando el archivo 20110915) contiene herramientas de desarrollo como re2c, bison y algunos comandos adicionales que necesitará para compilar PHP. El paquete conocido (estoy usando el archivo 5.4 porque coincide con la versión de PHP que compilaré) contiene los encabezados mínimos y las dependencias de biblioteca necesarias, como zlib.h.

Probablemente no hace falta decir que también desea descargar la fuente de PHP desde windows.php.net. En el momento de escribir este artículo, la versión actual de PHP es 5.4.6, por lo que verá este número de versión en los ejemplos.

Es una buena idea crear espacio de trabajo, a los que puedes descomprimir el código fuente y compilarlo para que no afecten al resto de tu sistema. Cree una carpeta C:\PHP-Dev para que sirva como directorio de trabajo y luego extraiga el archivo binario y las herramientas en ella.

A continuación, extraiga el contenido del archivo, fuente de PHP en C:\PHP-Dev ahora tiene php5.4 en la carpeta de origen, y luego extraiga su archivo deps a la carpeta hermana de deps. La estructura del directorio debería verse así:

Abra el símbolo del sistema de Windows SDK que se instaló con el SDK (Inicio => Microsoft Windows SDK => Símbolo del sistema de Windows SDK) y ejecute los siguientes comandos:

Setenv /release /xp /x86 cd C:\PHP-Dev bin\phpsdk_setvars.bat

Usar el SDK de la consola de línea de comandos preferiblemente antes de la consola cmd.exe normal, ya que establece mucho Variables de entorno específico de la compilación código fuente. Las compilaciones de comandos posteriores también deben realizarse en esta consola.

setenv establece algunas propiedades del ensamblado para el entorno, en este caso se establece el entorno de la versión objetivo del ensamblado de Windows XP de 32 bits. Puedes intentar construir con /x64 si buscas aventuras. Definición varias versiones Es muy probable que Windows como /Vista tenga problemas de salida debido a algunas definiciones extrañas en los scripts (PHP todavía quiere ser compatible con XP). A menos que realmente sepa lo que está haciendo, probablemente sea más seguro ceñirse a los valores recomendados que he usado anteriormente.

El script phpsdk_setvars.bat va por un poco más Variables de entorno, el proceso de compilación pudo encontrar las herramientas binarias.

Tenga en cuenta que todas estas variables de configuración son solo sesiones temporales en la consola. Si cierras todo rápidamente para volver a la compilación más tarde, necesitarás ejecutar el comando nuevamente, y si no lo haces, recibirás errores como el siguiente, cuando luego ejecutes configure, no podrás continuar:

Comprobando bison.exe... ERROR: se requiere bisonte

Asegurarse de tener el entorno de compilación correcto, las fuentes requeridas y sin dependencias es la parte más difícil del proceso. Entonces, ahora que su entorno está configurado desde la fuente y las dependencias en su lugar, ¡es hora de compilar!

Compilando PHP

En el símbolo del sistema del SDK, vaya a la carpeta de origen de PHP y ejecute buildconf. El comando es responsable de generar los archivos de configuración que creará Makefile para controlar el proceso de compilación.

Después de que se complete buildconf (solo toma un segundo), ejecute configure --help - y examine la ayuda para saber qué características desea habilitar/deshabilitar, luego ejecute configure (settings) nuevamente con la opción que desee. Es una buena idea verificar la salida antes de continuar, ya que le avisará si alguna de las dependencias requeridas no está disponible. Si esto sucede, puede instalar las dependencias y volver a ejecutar la configuración, o ajustar la llamada para deshabilitar las extensiones que las necesitan.

Finalmente, ejecute NMAKE para comenzar a compilar.

Cd C:\PHP-Dev\php5.4 buildconf configure nmake nmake test

Si falla la configuración o NMAKE, el problema es uno de dos: primero, el entorno no está configurado correctamente, segundo, ha habilitado una función que depende de bibliotecas externas y las bibliotecas no están instaladas en su sistema. Vuelva a verificar que haya creado el entorno como se indicó anteriormente y que se hayan configurado las bibliotecas adicionales que pueden ser necesarias en los ajustes de configuración base.

Cuando se complete el primer proceso de compilación de NMAKE, encontrará su nuevo Archivos PHP en la carpeta Release_TS. La prueba NMAKE ejecuta nuevas pruebas dobles de error de capacitancia para asegurarse de que todo funcione como debería. Los resultados de las pruebas NMAKE se envían al equipo de QA, que depende de ellos para mejorar PHP, por lo que puede tardar unos minutos en funcionar, esto es un asunto de responsabilidad.

En este punto, también puede usar el paso de complemento NMAKE opcional, que creará archivos ZIP y binarios que puedes copiar.

Extensiones de compilación

Hay dos formas de compilar extensiones de PHP: estática y dinámicamente. Una extensión compilada estáticamente se compila en un binario de PHP, mientras que una compilada dinámicamente es una DLL separada que se puede cargar más tarde a través del archivo php.ini. Las extensiones generalmente se compilan a partir del estado de la DLL, aunque también hay algunos beneficios para la compilación estática, en última instancia, depende de sus necesidades.

Para compilar extensiones de PHP en Windows, extraiga la carpeta del código fuente de la extensión a la carpeta ext en su directorio fuente de PHP. Luego, vuelva a configurar el script ejecutando buildconf --force y recompilando PHP usando las cláusulas apropiadas para habilitar la extensión.

Como ejemplo, compilemos una extensión AOP estáticamente. Descargue el código fuente de PECL y extráigalo a una carpeta en la ext. Luego haz lo siguiente:

Cd C:\PHP-Dev\php5.4 buildconf --force configure --enable-aop nmake

Con la opción --force, buildconf lo obliga a restaurar el script de configuración. Luego, ejecute configure --help y debería ver una opción para incluir la nueva extensión en la salida. En este caso, es --enable-AOP.

Cuando nmake termine, necesitará un binario PHP recién construido con AOP.

Las extensiones estarán disponibles como una DLL en lugar de horneadas en PHP, puede seguir los mismos pasos que arriba, pero especificando "shared" (compartido) como el valor a configurar permite la opción.

Buildconf --force configure --enable-aop=compartido

La DLL resultante estará en la carpeta Release_TS junto con la compilación binaria de PHP, en este caso el nombre es php_aop.dll.

PD

Compilar en Windows sigue siendo un poco complicado, especialmente cuando se trata de extensión. Ser capaz de compilar el código fuente es una buena habilidad, especialmente si luego desea modificar PHP.

El artículo fue preparado para usted por el equipo del sitio.
Artículo original:
Traducido por: Victor Klim

Aleksey Romanenko: Mi nombre es Alexei Romanenko, trabajo para RBC. El tema de este informe es algo controvertido. Parecería, ¿por qué compilar scripts PHP cuando todo parece funcionar de todos modos?

Probablemente la pregunta principal: "¿Por qué?" En general, el propósito de esta presentación es tratar de entender si se necesita tal compilación, si es así, por qué, en qué forma y para quién.

¿Qué es un compilador de PHP?

Primero, una pequeña descripción general de lo que es un compilador de PHP. Te diré 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, algún tipo de servidor CGI (Common Gateway Interface) y otros). También está integrado SAPI, que le permite integrar PHP en cualquier aplicación.

La segunda parte principal es PHP Core, que maneja solicitudes, implementa todas las redes, sistema de archivos y analizando los propios scripts.

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

Una de las partes más importantes y grandes es el módulo 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 lleva a cabo un análisis léxico: se carga un archivo, se analiza, todos los caracteres del conjunto de este archivo se traducen a un determinado conjunto de tokens, con los que luego trabajamos.

La fase de análisis analiza estos tokens. Sobre la base de este análisis, se compila una determinada estructura gramatical, 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 repite este esquema de acciones con ellos cada vez, todo funcionará muy lentamente. Cuando varios cientos o miles de solicitudes llegan a nuestro intérprete al mismo tiempo, simplemente no hay velocidad.

Pero hay soluciones. Se conocen desde hace mucho tiempo.

¿Cómo lograr la aceleración?

La solución más simple, económica y bien probada es el almacenamiento en caché de bytecode. En lugar de pasar por fases de análisis sintáctico, simplemente almacenamos en caché nuestro código de bytes. Hay extensiones especiales para esto, son bien conocidas por todos los que han trabajado con PHP, estas 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 (será una extensión 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, la opción tiene derecho a la vida, pero solo en el caso de que no haya suficiente código php. En proyectos grandes, grandes (o los que existen desde hace bastante tiempo), se suele acumular mucho, y se tardará mucho en reescribirlo todo. Los requisitos comerciales no le permitirán hacer eso. En general, escribir algo en PHP, por ejemplo, para un servidor front-end no es demasiado largo, porque es un lenguaje simple. Le permite hacer rápidamente cosas que toman más tiempo en lenguajes de bajo nivel.

también hay Opción alternativa uno que ha ganado fuerza últimamente es compilar PHP en algún lugar, en algo más rápido.

Vamos a compilar algo, ¿de acuerdo?

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

En este caso, puede ser de dos tipos.

El código nativo es un tipo de 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.

¿Qué se puede usar para compilar código nativo de PHP?

Compilador Roadsend. Su secuela es Raven. También hay PHC (esto es PHP fuente abierta compilador). Recientemente también ha aparecido HipHop (Facebook).

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

En mi opinión, el compilador más antiguo es Roadsend. Empezó a desarrollarse hace bastante tiempo, en 2002. Originalmente era una aplicación comercial. Se cerró, solo en 2007 se lanzó en Open Source. hay muy esquema complejo compilación: se utiliza algún compilador de Bigloo para el lenguaje Scheme, tras lo cual se genera código nativo. Este compilador no utiliza Zend Engine.

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

El trabajo en Roadsend, que yo sepa, no está actualmente en marcha. Renació como el proyecto Raven, que fue completamente reescrito en C++. Como compilación, utiliza LLVM para generar código.

Sobre el este momento todo parece muy prometedor.

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

Todo sería triste si no tuviéramos APS. Este es un compilador de código abierto. Se ha desarrollado desde 2005. Una de sus desventajas: utiliza SAPI integrado. No abandonamos la máquina Java, el Zend Engine. Esencialmente, traduce el código PHP al código del módulo de extensión PHP. Después de eso, compila, pero el proceso de ejecución, nuevamente, usa Zend Engine.

ejemplo de atención primaria de salud

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

Se trataba de una aplicación que se ejecuta en la línea de comandos.

Para iniciar una aplicación web, debe realizar varias acciones, es bastante difícil. Primero necesita generar una extensión (ing. Extensión), luego compilar el código y luego de alguna manera (ya sea dinámica o estáticamente) conectarlo.

Beneficios clave de la APS

De hecho, usamos el mismo PHP, tenemos compatibilidad total. Todas las demás extensiones son compatibles. Todo lo que hemos compilado, lo usamos. Bastante buena documentación.

Por cierto, una de las ventajas añadidas de PHC es que podemos generar el trabajo XML de nuestro script en función de cómo se construye el XML, a veces esto puede ser útil.

menos

En mi opinión, este es un binario inferior, porque aún depende del motor Zend. También existe cierta dificultad en cuanto a la conexión de proyectos web.

Lo esencial

Probablemente, este informe no hubiera sucedido si no hubiera aparecido HipHop, una solución de Facebook. 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 de reescritura, se decidió escribir un traductor (en este caso, en código C ++). El proyecto es relativamente joven, oficialmente se lanzó solo en febrero de este año. El código PHP se traduce a código C++ y luego se genera medios estándar tu sistema operativo Cierto, aunque solo se admite sistema operativo linux

Justo ayer, le pregunté a un representante de Facebook sobre esta decisión. Dijo que por el momento el 100% del código PHP está compilado a través de HipHop. V forma pura El código no funciona a través del intérprete de PHP. Nuevamente, los creadores reclamaron una reducción significativa en la carga del procesador.

La funcionalidad principal de HipHop

Genera directamente el propio binario, que se puede ejecutar en la línea de comandos. Existe tal opción para iniciarlo como un servidor web de transmisión. También hay un depurador incorporado separado. Puede depurar scripts tanto de forma local como remota (funcionará como un servidor).

El proceso de montaje es bastante no trivial. Hay una descripción, pero no se recopila en todas partes. Por el momento, como dije, todo va bajo Linux, además inicialmente todo estaba "afilado" para 64 bits. Aunque ahora se admiten experimentalmente 32 bits. Pero logré compilar y parchear un poco; en general, hizo todo esto porque, de forma predeterminada, no se recopila.

También tienen sus propias versiones de libcore y creo que hay un par de bibliotecas que también deben parchearse. En general, el proceso de montaje no es tan sencillo.

En la salida después del ensamblaje, obtenemos cierto 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 de los principales que puede necesitar.

Como archivo de configuración(config) podemos usar el archivo HDF configurando varias directivas. Podemos establecer el nivel de errores 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 comandos.

Establecemos el nivel de registro durante la compilación: mostrar todos los errores o también mostrar advertencias (advertencias en inglés), Información adicional, o en general mantener 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.

Un ejemplo de ejecución de una compilación de un script PHP

El tercer nivel de registro está configurado, es bastante información general tiempo, se puede ver cuánto tomó. En realidad, el guión es bastante simple. 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. De hecho, nuestro "Hello, World" tiene 28 MB. Quería señalar que, además de la línea estándar "Echo" ¡Hola, mundo!), Este binario incluye muchas otras cosas. Este es un servidor web completo, un servidor completo para administración.

¿Qué obtenemos?

Tenemos "Hola…" en C++, que ejecuta una función que consiste en una sola línea "echo "Hola, mundo". Además, se cargan muchas cosas de terceros. Como podemos ver, se trata de una función completa. archivo C++.

Este es el programa resultante. Ya tiene bastantes teclas diferentes para diferentes configuraciones, pero señalaré solo algunas de ellas.

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

Configuración usada en el mismo formato. No comencé a dar directivas, porque hay muchas. HipHop viene con documentación. No está en el sitio wiki, pero se proporciona documentación con el kit de distribución, donde todo se describe claramente. Ni siquiera esperaba que la descripción fuera tan detallada, lo que permite una configuración bastante flexible de la solución.

Para ejecutar en modo servidor, podemos especificar un puerto. Para la administración, se usa un puerto separado, donde puede agregar algunas solicitudes que le permitan administrar el servidor. Si tenemos un servidor de depuración ejecutándose, entonces especificamos 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. Al realizar solicitudes http simples, podemos obtener estadísticas, o de alguna manera controlar el servidor, u obtener información adicional. En general, es muy conveniente.

Opción para obtener información de estado

Es posible obtener el conjunto de estado del servidor, en varios formatos integrados (xml, json, html). De hecho, se proporciona información sobre el propio 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 realizan con él.

Estadísticas de memoria llena

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

depuración

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

En el primer caso, ejecutamos el código con la tecla “-f” y vemos cómo se comporta el archivo; toda la salida va a stdout. 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 (puntos de interrupción ing.), ejecutar, ingresar valores de variables, seguimiento y más.

Uno de características adicionales

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

Contras del hip hop

Actualmente, HipHop no admite construcciones y funciones de lenguaje como eval(), create_function() y preg_replace() con /e, aunque todas ellas son análogas a eval(). Es cierto que, en versiones recientes, en mi opinión, aún puede habilitar eval () a través de config. Pero no se recomienda hacerlo. En general, eval() es malo de usar.

Las principales ventajas del HipHop

Por supuesto, la principal ventaja es el soporte de Facebook. Funciona y se desarrolla bastante activamente. Hay una comunidad de desarrolladores alrededor de este proyecto. Se ha escrito una implementación de PHP completamente nueva.

Como decía, el plus es que se genera código nativo. Se reclama un aumento en el rendimiento al reducir el costo de cargar el procesador (las pruebas lo confirman).

Es bastante flexible en la configuración. Me sorprendió gratamente que hay bastantes opciones para personalizar. Creo que esto se debe al hecho de que el proyecto realmente funciona. Todo lo que se usa se incrementa.

Como mencioné, HipHop ofrece bastantes extras. Entre ellos, uso como servidor RPC, administración, estadísticas varias, y mucho más. Por cierto, también hay una API para trabajar con otros idiomas.

Hay bastante buena documentación para esta solución. Otra ventaja: esta es una solución que está realmente lista para usar en producción (ejemplo - Facebook).

menos

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 de MySQL. No hay soporte para PostgreSQL aquí.

También existe un momento como la complejidad del montaje, que ya mencioné. Hay problemas con la construcción en sistemas de 32 bits. Pero creo que esto se arreglará pronto. Hasta ahora, solo se utiliza la compilación de PHP 5.2. La versión 5.3 aún no es compatible, pero será compatible según lo prometido.

¿Qué no se debe esperar de un recopilatorio en general y del HipHop en particular?

La compilación no acelerará de ninguna manera sus consultas SQL lentas en la base de datos. Si embotellamiento- esta es la base, luego compilarla o no compilarla, no tendrá sentido.

La compilación no acelera la carga de estática, solo en términos de dinámica. Complica mucho la depuración. Probablemente, muchos están acostumbrados al hecho de que todo se depura de manera bastante simple en PHP. Al compilar, esto ya no funcionará. 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 compilar cada vez.

No espere que esta sea una especie de "bala de plata" que resolverá todos sus problemas. De hecho, la compilación resuelve una gama bastante estrecha de problemas. Si lo son, eso podría ayudar.

¿Qué problemas resuelve la compilación?

Reduce la carga en la CPU, ya que cuando se trabaja activamente con PHP, con una gran cantidad de solicitudes, la carga aumenta bastante. Por supuesto, me gustaría realizar algunas pruebas.

Pruebas

La primera prueba (la más simple) es una operación bastante costosa que lleva mucho tiempo completar. En las pruebas, traté de abstraerme, de no hacer solicitudes usando algún recurso externo.

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

Para la segunda prueba de rendimiento, tomé el script PHP oficial, que se puede descargar desde SVN. Realiza una serie de funciones que realizan clasificación, asignación, suma, operaciones bastante costosas desde el punto de vista de las matemáticas.

HipHop estaba por delante de nuevo. Y con PHP estándar, la diferencia horaria es de aproximadamente 3 veces. PHC se desempeñó mejor aquí, pero aproximadamente el doble de malo que HipHop.

PHP se usa principalmente para transmisiones que procesan solicitudes http; vale la pena tener esto en cuenta.

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

Para ser honesto, no realicé pruebas en un servidor, sino en una computadora portátil. Los números, por supuesto, pueden no corresponder completamente a la realidad, pero en este caso los resultados son normales. Vale la pena señalar que a medida que aumenta la carga, la cantidad de solicitudes y la cantidad total de solicitudes crecen simultáneamente. El siguiente es RPS. Se probó una página estándar, que incluye 10 algunos inclusiones simples. De hecho, esto está probando PHP como intérprete.

Pregunta desde el piso:¿Cuáles son los números en la celda - segundos?

Aleksey Romanenko: Esto es fps.

Aquí podemos concluir que con un aumento en 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. Se nota que añade, por ejemplo, como Apache, un aumento de rendimiento de unas 2 veces. Este es también el caso de Nginx. Pero el hecho de que Nginx sea lento no significa que este paquete sea peor. Sólo una prueba específica. Si realmente probamos aquí, entonces Apache "morirá" en consultas lentas.

Probablemente, quiero entender si lo necesitamos o no.

¿Cuándo debería considerar compilar?

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

Para algunos casos en los que necesita la autonomía de su aplicación para ejecutarse, este método no es adecuado.

Reducción del número de servidores. Cuando hay muchos servidores, al reducir el rendimiento 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 100-200 de ellos, entonces, probablemente, hay un punto.

La razón principal por la que Facebook comenzó a usar HipHop es la presencia de grandes cantidades de código PHP que no puede ser reescrito (ya sea por nadie o simplemente costoso). Un aumento de 2x en el rendimiento ya es algo bueno.

Probablemente todo. Esperando preguntas.

Preguntas y respuestas

Pregunta desde el piso: Hola. Dígame si tiene otros ejemplos de implementaciones exitosas de Hiphop además de Facebook. ¿Le gustaría traducir el sitio web de RBC, por ejemplo, a HipHop? Aleksey Romanenko: Voy a empezar con el segundo. El sitio web de RBC es difícil de traducir. En cuanto a la implementación exitosa. Compilé PHP Unit yo mismo, se compiló con éxito. Además, hasta donde yo sé, la placa PHP Bunty se compila con éxito. De hecho, varias organizaciones ya utilizan la compilación. Pruebas adicionales mostrarán qué tan justificado será usar este proyecto. Pregunta desde el piso:¿Puede dar un ejemplo de una organización que lo utiliza? Aleksey Romanenko: Para ser honesto, no te lo diré ahora, pero esto es Occidente. Que yo sepa, nadie nos utiliza. Pregunta desde el piso:¿Cuál es la diferencia en el tiempo de ejecución aparte de la falta de soporte para algunas de las funciones que mencionó? ¿Qué tan peligroso es traducir un proyecto "en vivo"? Aleksey Romanenko: La diferencia es que cualquier programa compilado puede fallar. Quizás aparecerán algunos problemas que aún no han sido identificados. De hecho, hay una serie de diferencias en el "comportamiento" de 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 es esencialmente un 99,9 % equivalente al que funcionaría cuando se compilara. Es mejor probar su código no con un intérprete de PHP estándar, sino, como dije, con hphpi para PHP.

Todos los compiladores de PHP gratuitos que se presentan aquí pueden recompilar scripts PHP en código de máquina que puede ejecutarse en una computadora sin descargar un intérprete de 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 (cuando sea necesario) máquina virtual Java para instalar)).

Dichos compiladores pueden ser útiles para una variedad de propósitos: pueden hacer que su secuencia de comandos se ejecute más rápido porque ya no se interpretan en tiempo de ejecución; o gracias a ellos, puedes distribuir tus aplicaciones sin revelar el código fuente (que requieren otros scripts comerciales). Supongo que también son adecuados en el caso de que uno quiera escribir programas PHP dependientes de Internet y distribuirlos con una función de ejecución de escritorio (a diferencia de las aplicaciones web normales que se ejecutan en un servidor), todo esto es posible porque PHP es un fácil -para aprender el lenguaje de programación y básicamente contiene muchas funciones integradas con acceso a Internet. (En este caso, tendrá que distribuir aplicaciones con un servidor web incorporado o usar un compilador que compile el servidor en su aplicación).

Por cierto, si desea utilizar la ofuscación en su código, debe saber que esto también es posible utilizando acelerador PHP. También se supone que estos aceleradores aceleran la ejecución de su script.

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

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

Bambalam (nuevo)

Este programa produce Aplicaciones de Windows EXE para su código fuente PHP. No es exactamente un compilador de código nativo, ya que solo codifica el código fuente e incorpora un intérprete de PHP, pero este programa es definitivamente 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 incorporada de PHP 4.4.4 (el programa no se ha actualizado desde 2006). El código fuente de Bambalam es de dominio público.

Phalanger (para .NET)

Phalanger compila su código PHP a código de bytes CLI (.exe o .dll). Este programa se puede ejecutar a través de .NET 4.0 o marcos Mono. Su código PHP puede usar cualquier objeto .NET y bibliotecas adicionales del estándar extensiones PHP. El ensamblado NET resultante se puede firmar u ocultar. Este programa también lanza plantillas que le permiten crear aplicaciones PHP con Visual Studio. 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 admite todas las funciones. Versiones de PHP 5.3 (por supuesto, excepto por algo como evaluar()). Funciona y compila código para Linux de 64 bits y FreeBSD. Dado que el programa se distribuye en forma de código fuente, deberá compilarlo manualmente (usted mismo). Se publica bajo la licencia PHP.

Roadsend PHP (para código nativo).

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

Proyecto Cero (para Java)

(Nota: este software parece estar obsoleto. El sitio ha estado fuera de alcance durante medio año). Project Zero incluye un compilador y CLR que puede compilar su código PHP en código de bytes de Java y ejecutarlo. Tenga en cuenta que Project Zero es más que un simple compilador/tiempo de ejecución de PHP; es un marco maduro que le permite mejorar las aplicaciones web utilizando PHP o Groovy (otro lenguaje de secuencias de comandos). Este compilador está disponible para Windows, Mac OS X y Linux. Para trabajar con este compilador, deberá descargar el kit de desarrollo de Java.

¿Qué compilador prefieres? ¿O tienes otro traductor favorito? Deje sus observaciones y comentarios a continuación, con gusto los leeremos y terminaremos.

Etiquetas: Compiladores de PHP, traducción de scripts

PHP es un lenguaje de programación interpretado, con cada solicitud analizando y "ejecutando" el 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. Así la interpretación, a primera vista forte PHP cuesta más recursos y tiempo de CPU.

A continuación hablaremos de los compiladores que te permiten compilar codigo php en C++ y su en un ejecutable. De este modo aplicaciones PHP ejecutado directamente por el procesador, sin pasar por el intérprete.

Comprobemos si todo es tan bueno en la práctica.

Cómo funciona el intérprete

La interpretación del código PHP se lleva a cabo en dos etapas:

  1. Análisis de código y generación de códigos de operación (Zend opcodes): 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 (usando el caché de código de operación), la segunda es bastante cerrada: el intérprete siempre es un intermediario entre el conjunto de instrucciones y el procesador que las ejecuta. Sin un intérprete, el procesador no puede decidir 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 ellos es HipHop de Facebook. Sintámoslo más cerca.

hip hop php

HipHop está escrito por los desarrolladores de Facebook y es una aplicación que:
  1. optimiza el código PHP
  2. convierte a c++
  3. genera desde su aplicación un servidor web de subprocesos múltiples ejecutándolo
  4. compila a código ejecutable usando g ++

Así, en la entrada está el código PHP, en la salida está el servidor, parte del cual es la funcionalidad escrita.

Veamos cómo maneja HipHop 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/, obtenemos el archivo hphp, que es el compilador. Antes de compilar, configure las variables de entorno:

Cd .. # ir a la carpeta hiphop exportar HPHP_HOME=`pwd` exportar HPHP_LIB=`pwd`/bin exportar CMAKE_PREFIX_PATH=`/bin/pwd`/../

¡y ve!

Descarga Wordpress y descomprime el archivo:

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

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

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

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

WordPress está listo.

Hiphop"debe especificar una 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, comencemos:

$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") obtendremos el servidor web compilado. Ejecutémoslo (si algo se bloquea en el puerto 80, por ejemplo apache o nginx, primero debe 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

¡Voila! Ir a http://localost verá un blog de Wordpress en funcionamiento.

Rendimiento

Veamos si habrá un aumento de rendimiento en comparación con la versión sin compilar de WordPress que se ejecuta en apache2. A continuación se muestra un gráfico de la dependencia de la velocidad de generación de páginas en el número de usuarios paralelos.

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

Resumir

Después de unos resultados tan impresionantes, solo se puede decir una cosa: los chicos de Facebook hicieron un gran trabajo. El compilador realmente convierte la aplicación en un cohete, y aunque la aplicación debe prepararse antes de compilarla, el resultado vale la pena.

A este tema:

Si le gustó la publicación, haga clic en Google +1, estaré más motivado para escribir más y simplemente agradable.

Los lenguajes de programación vienen en dos variedades: interpretados y compilados. ¿Qué lenguaje es PHP? Para responder a esta pregunta, necesitamos entender la terminología.

Un programa que traduce el código escrito en un lenguaje de programación a otro se llama traductor. Un compilador es también un traductor. Traduce el código escrito en un lenguaje de alto nivel a código de máquina. El proceso de compilación produce un binario. Archivo ejecutable, que ya se puede ejecutar sin un compilador.

El intérprete es una categoría completamente diferente. El intérprete no traduce el código, sino que lo ejecuta. El intérprete analiza el código del programa y ejecuta cada una de sus líneas. Cada vez que ejecuta dicho código, debe usar un intérprete.

En términos de rendimiento, los intérpretes son significativamente inferiores a los compiladores, ya que el código binario se ejecuta mucho más rápido. Pero los intérpretes le permiten controlar completamente el programa durante su ejecución.

En lo que respecta a PHP, no es ni un compilador ni un intérprete. PHP es un cruce entre un compilador y un intérprete. Tratemos de entender esto y consideremos cómo PHP procesa el código.

Considere la figura:

Vemos que PHP se compone de dos bloques casi independientes: un traductor y un intérprete. ¿Por qué era necesario hacerlo? Por supuesto, por razones de velocidad.

La entrada de PHP es un script. Lo traduce (traduce), verificando la sintaxis, en un bytecode especial (representación interna). Luego, PHP ejecuta el código de bytes (no el código del programa real) sin crear un ejecutable.

Bytecode es mucho más compacto que el código de programa ordinario, por lo que es más fácil (y rápido) de interpretar (ejecutar). Juzgue usted mismo: el análisis se lleva a cabo solo una vez en la etapa de traducción, y el "producto semiacabado" ya se está ejecutando: el código de bytes, que es mucho más conveniente para estos fines. Por lo tanto, PHP es más un intérprete que un compilador. Tal "doble trabajo" era necesario para los siguientes propósitos.

Considere un bucle:

Para(i=0;i<10; i++) { Operator_1; Operator_2; Operator_3; ............ Operator_99; Operator_100; }

Tal ciclo "girará" 10 veces. Para cada uno de estos diez pases, el intérprete debe y 100 líneas de código. ¡Y en él necesitas analizar y ejecutar 10 * 100 = 1000 líneas de código! Si traduce el ciclo completo una vez a un código de bytes, ¡entonces tendrá que analizar 10 veces menos! ¡Esto significa que los scripts se ejecutarán 10 veces más rápido!

Resulta que PHP es.

La fase principal del trabajo de PHP es la interpretación de la representación interna del programa y su ejecución. Es esta fase la que toma más tiempo en escenarios serios. Sin embargo, la desaceleración no es tan significativa.

Vale la pena recordar que la versión 3 de PHP era un intérprete "puro", y con PHP 4, los scripts se ejecutan mucho más rápido, ya que PHP 4 (y PHP5) es un intérprete.

El lenguaje Perl, que casi siempre se denomina compilador, funciona exactamente de la misma manera: traduce el texto del programa en una representación interna y luego usa el código resultante cuando se ejecuta. Así que se podría decir que la versión 4 de PHP es un compilador tanto como lo es Perl.

Por lo tanto, nos vemos obligados a concluir que PHP es un intérprete con una unidad de traducción integrada que optimiza el curso de la interpretación.

Usar un intérprete (y por lo tanto PHP) tiene sus innegables ventajas:

  • No hay necesidad de preocuparse por liberar la memoria asignada, no hay necesidad de cerrar los archivos cuando termine de trabajar con ellos; el intérprete hará todo el trabajo de rutina, ya que el programa se ejecuta bajo su control;
  • No tiene que pensar en tipos de variables, y no tiene que declarar una variable antes de usarla por primera vez;
  • La depuración de programas y la detección de errores se simplifican enormemente: el intérprete tiene control total sobre este proceso;
  • En el contexto de las aplicaciones web, el intérprete también tiene otra ventaja muy importante: no hay peligro de que el servidor se "cuelga" si el programa no funciona correctamente.

Hay otros beneficios también. En general, el uso de un intérprete puede dar a los scripts el poder que los usuarios de la Web esperan de ellos.

La penalización de rendimiento de PHP es notable en el caso de bucles grandes y complejos, cuando se procesa una gran cantidad de líneas, etc. Sin embargo, tenga en cuenta que este es el único inconveniente de PHP, que se manifestará cada vez menos a medida que salgan procesadores más potentes, por lo que que eventualmente, desaparecerá por completo.

<<< Назад
(¿Qué hay de nuevo en PHP5?)
Contenido Adelante >>>
(Pasando a PHP 5.3)

Si tiene más preguntas o algo no está claro, bienvenido a nuestro