Una característica muy atractiva sin lugar a dudas que tiene PHP es que puede extenderse, es decir crear módulos específicos o generales para que realicen algún par de tareas que necesitamos en nuestro desarrollo, para ello existen varios métodos para crear extensiones como internas, externas dentro de la misma aplicación:
- Los módulos externos son llamados por una rutina php utilizando la función dl() donde la extensión puede estar ubicada en cualquier parte del disco duro.
- Las extensiones internas son compiladas dentro del mismo del proceso php.
Cualquiera de los métodos anteriores se pueden realizar utilizando el api Zend para la versión php 4 en adelante.
Antes de empezar es importante analizar la estructura de los directorios del código fuente de php para comprender la utilidad de cada uno de ellos:
- php4/ext/ aquí se encuentran los códigos fuentes de todas las extensiones que incluye php en la instalación oficial, así como sus librarías, macros, y cabeceras necesarias para estas.
- php4/main/ Directorio que contiene las principales macros y definiciones php.
- php/pear/ Directorio que contiene extensión de aplicación de deposito de archivos PEAR.
- php4/sapi/ Contiene los diferentes capas de abstracción de servidores.
- php4/TSRM/ Librerías de TSRM
- php4/Zend Librerías del API de ZEND
Compilar PHP 1. Descargar la versión de php estable el código fuente.
http://www.php.net/downloads.php PHP 4.x.x (tar.gz)
2. Descargar las librerías para Windows:
- win32build.zip
- bindlib_w32.zip
Desde
www.php.net/extra/ 3. Dejar la siguiente estructura de trabajo.
+c:php-4.x.x
| |
| +--build//Carpeta con la distribución
| | |
| | +--...
| |
| +--win32//Carpeta con la distribución
| | |
| | +--...
| |
| +--win32build //Descomprimir el win32build.zip
| | |
| | +--bin
| | |
| | +--include
| | |
| | +--lib
| | |
| | +__...
| |
| +--bindlib_w32 //Descomprimir el bindlib_w32.zip
| | |
| | +--arpa
| | |
| | +--conf
| | |
| | +--...
| |
| +--...//Demás carpetas.... 4. Configuración de Microsoft Visual C++ 6 Ir al menú Tools/Options e ir a la pestaña Directories y añadir las siguientes rutas:
- Executable files: c:php-4.x.xwin32buildin
- Includes files: c:php-4.x.xwin32buildinclude
- Library files: c:php-4.x.xwin32buildlib
5. Generar la librería resolv.lib
- Abra MVC++ Seleccione el menú file/open Workspace, y abra c:php-4.x.xindlib_w32indlib.dsw y ábralo.
- Seleccione el menú Build/Set Active Configuration y seleccione Win32 Release y actívelo.
- Compilar todo, ir al menú Build/Rebuild All y listo se esta compilando las librería resolv.lib
- Una ves compilado hay que remplazar la librería C:php-4.x.xindlib_w32Release esolv.lib por el que esta en C:php-4.x.xwin32build lib esolv.lib
6. Compilar el código fuente de php4 para general la librerías php4ts.lib y php4ts.dll
- Cerrar el espacio de trabajo anterior.
- Crear una estructura de carpetas c:/usr/local/lib/ y copiar el archivo C:php-x.x.xwin32/buildin/bison.simple en la estructura que acaba de crear.
- Abrir desde menú file/open Workspace y abrir el c:php-4.x.xwin32php4ts.dsw
- Activar la configuración Build/Set Active Configuration y seleccionar php4ts - Win32 Release_TS y activarla.
- Compilar todos los fuentes: ir al menú Build/Rebuild All y listo.
- Copiar las librerías C:php-4.x.xRelease_TSphp4ts.lib y php4ts.dll y colocarlos dentro de: C:workphp-4.x.xwin32buildlib y listo..
Listo ya puedemos crear nuestras nuevas extensiones en dll para windows o compilar las que trae el código fuente de php.
Crear extensión de php para Windows externas dll 1. Crear un nuevo proyecto desde el menú file/new y elegir: win32 Dynamic-Link-Library poner la ruta location: C:PHP-4.x.xEXT y poner el nombre la clase "demo".
Siguiente y elegir la opción: An empty DLL project y finalizar la creación del proyecto.
2. Verificar las rutas de directorios dentro de tools/Opctions en la pestaña Directories
- Executable files: c:php-4.x.xwin32buildin
- Includes files: c:php-4.x.xwin32buildinclude
- Library files: c:php-4.x.xwin32buildlib
Crear un win32 Release_TS desde la opción Build/Configurations como una copia de win32 Release con el nombre de Release_TS
Activar la configuración desde Build/Set Active Configuration Release_TS presione el boton de OK..
3. Ir al menú Proyect/Settings y elegir Release_TS
- En la pestaña c/c++ elegir en el cuadro de lista la categoría General e Introducir las siguientes definiciones de compilación en la opcion reprocessor definitions:
WIN32 ,PHP_EXPORTS, COMPILE_DL_DEMO, ZTS=1, HAVE_DEMO=1, ZEND_DEBUG=0, NDEBUG, _WINDOWS, ZEND_WIN32, PHP_WIN32
Notas: el COMPILE_DL_DEMO puede remplazarlo por COMPILE_DL_MI_MODULO al igual que HAVE_DEMO
- En la misma pestaña en la opción de la lista Code Generation seleccionar en run-time Library:
Multithreaded DLL
- En la opción de la lista Preprocessor añadir en Additional include directories:
...., ....main, ....Zend, ....TSRM, ....indlib_w32
- En la pestaña General en la opción Output files y iIntermedie files añadir:
Release_TS
- En la pestaña Link en la opción de lista General añadir la librería php4ts.lib dentro de la opción Object/library modules
- En la misma pestaña pero la opción Input añadir en Aditional library path:
....Release_TS, ....Release_TS_Inline
- Cerrar la ventana de dialogo y activar la configuración de Release_TS dentro menú /build/activar configuration.
4. Copiar el siguiente código como ejemplo:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#if HAVE_DEMO //Variable de compilacion
#include "ext/standard/info.h"
/* -------------------------------------
Dclaracion de funciones
-------------------------------------
*/
ZEND_MINFO_FUNCTION(demo);//funcion para la informacion del modulo
ZEND_FUNCTION(demo_serie); //Funciones del modulo
/*--------------------------------------
Crear la estructura de las funciones
demo_functions[]
--------------------------------------
*/
function_entry demo_functions[] =
{ ZEND_FE(demo_serie,NULL)
{NULL, NULL, NULL}
};
/* ---------------------------------------
Estructura para la informacion del modulo
---------------------------------------
*/
zend_module_entry demo_module_entry =
{ STANDARD_MODULE_HEADER,
"demo",
demo_functions,
NULL,
NULL,
NULL,
NULL,
ZEND_MINFO(demo),
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};
/**/
#ifdef COMPILE_DL_SAIMEETINGS
ZEND_GET_MODULE(demo)
#endif
/*----------------------------------------
Definición de las funciones
----------------------------------------
*/
ZEND_MINFO_FUNCTION(demo)
{ php_info_print_table_start();
php_info_print_table_row(2, "demo Support", "enabled");
php_info_print_table_row(2, "demo Version", "1.0 28-oct-2003");
php_info_print_table_end();
}
ZEND_FUNCTION(demo_serie)
{ long parameter;
if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC,"l",¶meter)==FAILURE
{
return;
}
RETURN_LONG(parameter);
}
/*-------------------------------------------*/
#endif5.Compilar la extensión desde el menú build/Rebuild All
6.Su extensión esta dentro de c:php-4.x.xRelease_TS