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:
Pero, ¿qué pasa con los ejemplos que muestran C++? extensiones siendo más de diez veces más rápido que php solo? – johnny
@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
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