Luego de estar un tiempo sin postear en el blog, vuelvo con una serie de post relacionados con la creación de extensiones para PHP.
Crear extensiones de PHP no es un tema muy popular entre los desarrolladores web, siempre usamos extensiones creadas por los demás pero ¿a nadie le pico el bichito de saber como crear una propia?
¡A mi! y la verdad que no es nada complicado hacer una.
Que ventaja brinda una extensión
Principalmente rapidez, al estar escrita en C y correr en el núcleo de PHP su rendiemiento es mucho mayor.
Existen dos timpos de extensiones: extensiones PHP y extensiones Zend. Las primeras agregan funcionalidad al lenguaje (por ejemplo Mysqli) y las segundas son extensiones de bajo nivel que modifican el núcleo del lenguaje (por ejemplo xdebug, APC).
Lo que necesitamos
Primero debemos instalar las herramientas para trabajar con C (bueno, también podemos escribir la extension en C++ pero ese será otro post) y alguna otra más:
sudo apt-get install libc6-dev sudo apt-get install gcc sudo apt-get install autoconf sudo apt-get install automake sudo apt-get install libtool sudo apt-get install bison sudo apt-get install flex sudo apt-get install re2x
Obviamente que tambien debes tener instalado una versión de PHP (5.2+).
Como la creamos
Cada extensión posee al menos los siguientes archivos
- config.m4 es el archivo de configuración para la compilación, indica que archivos se deben compilar y que librerías externas se necesitan
- php_miLibreria.h y miLibreria.c son los archivos de código/funcionalidad de la extensión.
Veamos un ejemplo
Como ejemplo crearemos una extensión “fredddy” que provea una función llamada freddy_hola a PHP y que imprime un simple saludo
config.m4
PHP_ARG_ENABLE(freddy, [Whether to enable the "freddy" extension], [ --enable-freddy Enable "freddy" extension support]) if test $PHP_FREDDY != "no"; then PHP_SUBST(FREDDY_SHARED_LIBADD) PHP_NEW_EXTENSION(freddy, freddy.c, $ext_shared) fi
Lo anterior es la mínima configuración necesaria que necesita la extensión, veamos de que trata:
- El primer parámetro de PHP_ARG_ENABLE setea en ./configure una opción llamada -enable-freddy
- El segundo parámetro de PHP_ARG_ENABLE se mostrara durante el proceso de configuración, indicando que se habilito la extensión
- El tercer parámetro de PHP_ARG_ENABLE se mostrara si se visualiza la ayuda de ./configure (./configure -help)
- Para la compilación se deben seguir 3 pasos: phpize, ./configure -enable-freddy, make
- Cuando se invoca a ./configure -enable-freddy se crea una variable local llamada PHP_FREDDY y se setea en ‘yes’
- PHP_SUBST es un macro similar a AC_SUBST() de C y es necesaria para crear la extensión
- PHP_NEW_EXTENSION declara el módulo y el archivo fuente para la compilacion. $ext_shared es similar a PHP_SUBST y es necesaria para crear la extensión como modulo
Si la extensión contara con mas de un archivo fuente para la compilación se deben definir todos en PHP_NEW_EXTENSION separados por un espacio (por ejempo: PHP_NEW_EXTENSION(freddy2, file1.c file2.c file3.c, $ext_sared)
php_freddy.h
Este archivo es el header del archivo .c que crearemos luego
#ifndef PHP_FREDDY_H /* Prevenimos la doble inclucion */ #define PHP_FREDDY_H /* Definimos las propiedades de la extension */ #define PHP_FREDDY_EXTNAME "freddy" #define PHP_FREDDY_EXTVER "0.1" /* Import configure options * when building outside of the * PHP source tree */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* Incluimos el header estandard de PHP */ #include "php.h" /* * define the entry point symbole * Zend will use when loading this module */ extern zend_module_entry freddy_module_entry; #define phpext_freddy_ptr &freddy_module_entry #endif /* PHP_FREDDY_H */
- config.h es incluido cuando se compila con phpize
- Se incluye php.h que provee funcionalidades para usar en nuestra extension
- zend_module_entry defina una estructura usada por Zend engine
freddy.c
#include "php_freddy.h"
PHP_FUNCTION(freddy_hola)
{
php_printf("Hola FreddY!!");
}
static function_entry php_freddy_functions[] = {
PHP_FE(freddy_hola, NULL)
{ NULL, NULL, NULL }
};
zend_module_entry freddy_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_FREDDY_EXTNAME,
php_freddy_functions, /* Functions */
NULL, /* MINIT */
NULL, /* MSHUTDOWN */
NULL, /* RINIT */
NULL, /* RSHUTDOWN */
NULL, /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
PHP_FREDDY_EXTVER,
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_FREDDY
ZEND_GET_MODULE(freddy)
#endif
Compilación
Ya tenemos todo listo para compilar nuestra primera extensión de PHP, para ello debemos hacer lo siguiente
phpize ./configure -enable-freddy make
Se abra creado una carpeta llamada modules con el archivo freddy.so, este es el archivo de nuestra extensión y el que debemos cargar en PHP
touch /etc/php5/apache2/conf.d/freddy.ini vim /etc/php5/apache2/conf.d/freddy.ini
Agregamos el siguiente código y reiniciamos apache
[freddy] extension=/var/www/extensiones/freddy/modules/freddy.so
Listo!
Podemos crear un archivo php para ver como funciona el ejemplo
<?php echo freddy_hola();
De a poco seguire subiendo más post y agregando nuevos conceptos de como crear extensiones para PHP.
Espero que les sea de utilidad.

