2010-09-03 11 views
16

Sé que técnicamente puedes hacer una extensión PHP simplemente haciendo un archivo PHP y usando require_once.Cómo hacer una extensión PHP

Pero, ¿optimizaría el rendimiento si escribiera una extensión en C o C++?

Si es así, ¿cómo harías un "mundo de hola" para eso?

Respuesta

6

Puede incorporar un programa autónomo C/C++ en su sitio PHP simplemente ejecutándolo y pasando el resultado al navegador. En cuanto a la interacción real, no vale la pena dedicar tiempo a escribir una biblioteca que contenga funcionalidades específicas del sitio. Esto simplemente no está hecho, excepto para interactuar con otras bibliotecas existentes (MySQL, imagemagick, etc.).

La programación para la web no es como el desarrollo de aplicaciones. Optimizar los bits de su código escribiéndolos en idiomas "más rápidos" (análogos a la escritura de bits pequeños y ajustados en bucle de su programa C++ en ensamble) no justifica el tiempo de desarrollo. Es mejor que mantenga su aplicación fácilmente mantenible, es por eso que los lenguajes de scripting dominan la web.

+1

Pero, ¿qué pasa con los ejemplos que muestran C++? extensiones siendo más de diez veces más rápido que php solo? – johnny

+0

@johnny Eso es irrelevante en casi todos los casos. Si le preocupa tanto el rendimiento, escriba * todo el sitio * en C++ y saltee PHP por completo. No hay ** valor ** al transferir cualquiera de sus funcionalidades a C++ hasta que demuestre una necesidad concreta de ganancia de rendimiento, y a menos que esté en la escala de Facebook, no tiene la necesidad. – meagar

+3

Esta es una mala respuesta. Facebook ha escrito bibliotecas de códigos C y extensiones para PHP desde su inicio. No habría forma de que Facebook escale si no fuera por ejecutar un lenguaje compilado más rápido como C/C++ para llevar a cabo la lógica comercial. – cj5

5

Here es un tutorial sobre las extensiones de PHP. Ya sea que optimice el rendimiento o no, depende de lo que intente envolver en su extensión. Pero no escribiría una extensión de PHP solo para fines de optimización. Escribiría uno si no tuviera otra opción. ES DECIR. Envolviendo una biblioteca C común para que esté disponible directamente en PHP ...

+0

El enlace está roto. – Araw

18

El software escrito en C/C++ ciertamente se ejecuta más rápido que el código en PHP. Y puede escribir una extensión en C/C++ y vincularla a PHP. El manual de PHP cubre esto aquí: http://php.net/manual/en/internals2.php

Las otras respuestas dan enlaces a otros tutoriales para escribir extensiones de PHP, y puede buscar en google "tutorial de extensión PHP" para encontrar más.

Pero si esto es lo que hay que hacer en tu aplicación es otra historia. La mayoría de los expertos coinciden en que PHP funciona bien, lo suficientemente rápido para el 98% de las aplicaciones. Las instancias donde PHP no es lo suficientemente rápido no se deben en general al lenguaje, sino a una arquitectura de aplicación ineficiente que el programador ha creado. Esa es una debilidad que no se puede remediar al reescribir partes de su aplicación en C/C++.

11

I know you can technically make PHP extension just by making a PHP file and using require_once .

La base de esta funcionalidad es la declaración include, que incluye y evalúa el archivo especificado. La extensión no es el término correcto, porque solo está incluyendo otro archivo de script PHP. Las extensiones de PHP proporcionan funciones adicionales al lenguaje en forma de un módulo compilado.

But would it optimize the performance, if you wrote an extension in C or C++.

Sí, optimiza el rendimiento. Es por eso que se escribieron extensiones PHP como CPhalcon o YAF.

How to make a "Hello World" PHP Extension?

Describiré cómo se puede construir una extensión de PHP "Hello World" en cinco pasos.

Se requiere un sistema operativo basado en Debian, porque tenemos que buscar algunas herramientas y dependencias con apt-get.

Paso 1 - Configuración de entorno de compilación/Requisitos

A PHP Extension se compila código C.Necesitamos un shell (ya debería estar instalado), un editor (a su elección), un compilador (aquí utilizaremos GCC), PHP en sí y dependencias de desarrollo PHP para la compilación.

sudo apt-get install build-essential php7.0 php7.0-dev 

Paso 2 - Configuración

Tenemos que describir nuestra extensión y los archivos que lo forman en un fichero de configuración básica:

del archivo: config.m4

PHP_ARG_ENABLE(php_helloworld, Whether to enable the HelloWorldPHP extension, [ --enable-helloworld-php Enable HelloWorldPHP]) 

if test "$PHP_HELLOWORLD" != "no"; then 
    PHP_NEW_EXTENSION(php_helloworld, php_helloworld.c, $ext_shared) 
fi 

Como puede ver, la NEW_EXTENSION contiene un archivo C: php_helloworld.c.

Paso 3 - Código

Vamos a crear el código C para nuestra extensión.

En primer lugar, se crea un archivo de cabecera:

php_helloworld.h

// we define Module constants 
#define PHP_HELLOWORLD_EXTNAME "php_helloworld" 
#define PHP_HELLOWORLD_VERSION "0.0.1" 

// then we declare the function to be exported 
PHP_FUNCTION(helloworld_php); 

En segundo lugar, vamos a crear el archivo de origen:

php_helloworld.c

// include the PHP API itself 
#include <php.h> 
// then include the header of your extension 
#include "php_helloworld.h" 

// register our function to the PHP API 
// so that PHP knows, which functions are in this module 
zend_function_entry helloworld_php_functions[] = { 
    PHP_FE(helloworld_php, NULL) 
    {NULL, NULL, NULL} 
}; 

// some pieces of information about our module 
zend_module_entry helloworld_php_module_entry = { 
    STANDARD_MODULE_HEADER, 
    PHP_HELLOWORLD_EXTNAME, 
    helloworld_php_functions, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    PHP_HELLOWORLD_VERSION, 
    STANDARD_MODULE_PROPERTIES 
}; 

// use a macro to output additional C code, to make ext dynamically loadable 
ZEND_GET_MODULE(helloworld_php) 

// Finally, we implement our "Hello World" function 
// this function will be made available to PHP 
// and prints to PHP stdout using printf 
PHP_FUNCTION(helloworld_php) { 
    php_printf("Hello World! (from our extension)\n"); 
} 

Paso 4 - Construir

Ahora, estamos listos para construir la extensión.

En primer lugar, preparar el entorno de construcción para una extensión de PHP:

phpize 

Luego configuramos la construcción y permitir a nuestros extensión:

./configure --enable-php-helloworld 

Por último, podemos construirlo:

make 
sudo make install 

Paso 5 - Prueba

Para probar nuestra extensión de PHP, permite cargar el archivo de extensión helloworld_php.so y ejecutar nuestra función helloworld_php():

php -d extension=php_helloworld.so -r 'helloworld_php();'

Hecho :)


Edificio en Windows

Si intentas construir un Windows (¡YIKES!), entonces es necesario ajustar los pasos un poco:

Paso 2 - Configuración

del archivo: config.w32

ARG_ENABLE("helloworld", "helloworld support", "yes"); 

if (PHP_HELLOWORLD == "yes") { 
    EXTENSION("helloworld", "php_helloworld.c"); 
} 

Paso 4 - Construir

Uso nmake vez de make.


lista de recursos útiles:

+1

¿Cómo escribo una extensión 'C++'? He estado buscando en toda la web y no pude encontrar nada más que tutoriales obsoletos. ¿Podría ampliar su respuesta para incluir un ejemplo de C++ o proporcionar algunos buenos enlaces a turboriales o ejemplos modernos? – razzak

+1

Bueno, C y C++ no son lo mismo. Sugeriría usar una biblioteca contenedora como PHP-CPP, vea http://www.php-cpp.com/documentation/your-first-extension para el inicio básico. Puede encontrar un tutorial para esta lib aquí: http://www.sitepoint.com/developing-php-extensions-c-php-cpp-advanced/ –

+0

'make' throws' php_helloworld.c: 28: 17: error : 'helloworld_php_module_entry' no declarado (primer uso en esta función) ' –

0

Creo argumento básico (pero no seguro) puede hacer que al hacer un archivo dll y ponerlo en la carpeta ext que existen con php archivos de instalación. si mis palabras anteriores son correctas, puede hacerlo (dll) file en visual studio

Cuestiones relacionadas