jueves, 28 de junio de 2012

Centos 5: PHP5 compilar modulo firebird

Ahora me toca ver como crear el modulo para accesar a Firebird en Linux con PHP, por default este modulo no viene en la instalacion generica o sea que no podemos instalar php-firebird o php-interbase.

En mi caso estamos trabajando con una maquina virtual, por lo tanto mi politica es que los servidores de produccion solo debe tener lo que necesita nada mas nada menos.

La version de Centos esta algo atrasada, por ello yo uso la version de ius-repo, en este momento estoy con la version 5.3.14.

Para ello yo tengo una vm con Xen que uso para compilar paquetes si llegara a tener que hacerlo como este caso, la version es para 64 bits.

Antes de yo llegar a compilar los modulos debo asegurar que el sistema de compilacion tenga lo necesario para llevar a cabo esto, asi que para firebird necesito esto:

firebird-libfbclient.i386
firebird-libfbclient.x86_64
firebird-libfbembed.x86_64
firebird-devel.i386
firebird-devel.x86_64
firebird-filesystem.x86_64

Para php:
php53u.x86_64
php53u-cli.x86_64
php53u-common.x86_64
php53u-devel.x86_64

Para compilacion y rpms:
rpm-build
gcc.x86_64
gcc-c++.x86_64
libgcc.i386
libgcc.x86_64

Necesito MySQL tambien ya que hay cierta prioridad de ejecucion:

mysql51.x86_64
mysql51-devel.x86_64
mysql51-libs.x86_64
mysql51-server.x86_64
mysqlclient15.x86_64
mysqlclient15-devel.x86_64
Para probar:
httpd

Creo que es todo, lo que sigue es bajar el codigo fuente de la version que deseamos la cual la podemos obtener del mismo sitio de ius-repo:


Yo tengo un folder en el root donde almaceno todo los codigos fuente de mis repos:

/root/rpm/

Una vez obtenido el repo debemos instalarlo ya que viene en formato rpm, para esto hacemos lo siguiente:

rpm -ivh php53u-5.3.14-1.ius.el5.src.rpm

De ahi se instala el codigo fuente en:

/usr/src/redhat/SOURCES/

Ahi dentro tenemos esto:

-rw-rw-r--  1 root root          159 May  9  2011 macros.php
-rw-rw-r--  1 root root          650 May  9  2011 php-4.3.11-shutdown.patch
-rw-rw-r--  1 root root          818 May  9  2011 php-5.0.4-dlopen.patch
-rw-rw-r--  1 root root          905 May  9  2011 php-5.0.4-tests-wddx.patch
-rw-rw-r--  1 root root          416 May  9  2011 php-5.2.0-includedir.patch
-rw-rw-r--  1 root root          607 May  9  2011 php-5.2.4-embed.patch
-rw-rw-r--  1 root root          682 May  9  2011 php-5.2.4-norpath.patch
-rw-rw-r--  1 root root        34930 May  9  2011 php-5.3.0-easter.patch
-rw-rw-r--  1 root root          637 May  9  2011 php-5.3.0-install.patch
-rw-rw-r--  1 root root          759 May  9  2011 php-5.3.0-oci8-lib64.patch
-rw-rw-r--  1 root root          937 May  9  2011 php-5.3.0-phpize64.patch
-rw-rw-r--  1 root root          727 May  9  2011 php-5.3.0-recode.patch
-rw-rw-rw-  1 root root         7144 Jun 21 15:18 php-5.3.14-aconf259.patch
-rw-rw-rw-  1 root root     14924167 Jun 14 09:10 php-5.3.14.tar.gz
-rw-rw-r--  1 root root        16390 May  9  2011 php-5.3.1-systzdata-v7.patch
-rw-rw-r--  1 root root         4409 May  9  2011 php-5.3.3-gnusrc.patch
-rw-rw-r--  1 root root         2114 May  9  2011 php-5.3.3-macropen.patch
-rw-rw-r--  1 root root        69399 May  9  2011 php53-ius.ini
-rw-rw-r--  1 root root          675 May  9  2011 php.conf
-rw-rw-r--  1 root root         1697 May  9  2011 php-fpm.conf
-rw-rw-r--  1 root root         1424 May  9  2011 php-fpm.init
-rw-rw-r--  1 root root          210 May  9  2011 php-fpm.logrotate
-rw-rw-r--  1 root root         9484 May  9  2011 php-fpm-www.conf

Ahora viene desempacar el codigo fuente:

tar -xzf  php-5.3.14.tar.gz

Ya tenemos le folder nos adentramos ahi:

cd php-5.3.14

Los modulos estan en el folder "ext":

cd ext

Tenemos lo siguiente:

bcmath      ext_skel            intl      openssl       phar        sockets    xml
bz2         ext_skel_win32.php  json      pcntl         posix       spl        xmlreader
calendar    fileinfo            ldap      pcre          pspell      sqlite     xmlrpc
com_dotnet  filter              libxml    pdo           readline    sqlite3    xmlwriter
ctype       ftp                 mbstring  pdo_dblib     recode      standard   xsl
curl        gd                  mcrypt    pdo_firebird  reflection  sybase_ct  zip
date        gettext             mssql     pdo_mysql     session     sysvmsg    zlib
dba         gmp                 mysql     pdo_oci       shmop       sysvsem
dom         hash                mysqli    pdo_odbc      simplexml   sysvshm
enchant     iconv               mysqlnd   pdo_pgsql     skeleton    tidy
ereg        imap                oci8      pdo_sqlite    snmp        tokenizer
exif        interbase           odbc      pgsql         soap        wddx

En mi caso mi interesa firebird, nos metemos a ese folder:

cd pdo_firebird

Empieza la fiesta, ejecutamos el comando phpize:

phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

De ahi configure:

./configure (sale un choricero...)
checking for egrep... grep -E
checking for a sed that does not truncate output... /bin/sed
checking for cc... cc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking for cc option to accept ANSI C... none needed
checking how to run the C preprocessor... cc -E
...
configure: creating libtool
appending configuration tag "CXX" to libtool
appending configuration tag "F77" to libtool
configure: creating ./config.status
config.status: creating config.h
config.status: config.h is unchanged

Por ultimo make:

make
/bin/sh /usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird/libtool --mode=compile cc -I/usr/include/php/ext -I. -I/usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird -DPHP_ATOM_INC -I/usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird/include -I/usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird/main -I/usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib  -DHAVE_CONFIG_H  -g -O2   -c /usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird/pdo_firebird.c -o pdo_firebird.lo
mkdir .libs
...
cp ./.libs/pdo_firebird.so /usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird/modules/pdo_firebird.so
cp ./.libs/pdo_firebird.lai /usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird/modules/pdo_firebird.la
PATH="$PATH:/sbin" ldconfig -n /usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/src/redhat/SOURCES/php-5.3.14/ext/pdo_firebird/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Listo, nuestro modulo esta en el folder modules:

ls modules/
pdo_firebird.la  pdo_firebird.so

Todos los modulos que queramos debemos guardarlos en mi caso como es una equipo de 64 bits, van en:

/usr/lib64/php/modules/

Ahi lo copeamos:

cp modules/pdo_firebird.so /usr/lib64/php/modules/

Ahora como estamos compilando modulos y no estamos usando el ya compilado php-firebird, debemos decirle a php que cargue los modulos generados, para ello debemos abrir el archivo php.ini y agregarlos,  al abrir el archivo existe una seccion para esto, +/- en la linea 810 agregamos esto debajo del parametro:

user_dir =

Esto:

;Modulos Personales
extension=pdo_firebird.so

Salvamos el archivo.

Ahora deseo aclarar que en mi caso requiero tambien el modulo mysql, entonces al final del proceso yo necesito esto:

extension=pdo.so
extension=interbase.so
extension=pdo_firebird.so
extension=pdo_mysql.so
extension=mysql.so
extension=mysqli.so

Compilo uno a uno, cuando lleguen a el modulo mysql, deben ejecutar el configure asi:

./configure --with-libdir=lib64

Llevamos todo lo compilado a el folder:

/usr/lib64/php/modules/

Ahora si, todo en su lugar reiniciamos apache:

service httpd restart

Revisamos el log de error de apache para ver si no hay problemas:

[Thu Jun 28 01:10:29 2012] [notice] caught SIGTERM, shutting down
[Thu Jun 28 01:10:29 2012] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Thu Jun 28 01:10:29 2012] [notice] Digest: generating secret for digest authentication ...
[Thu Jun 28 01:10:29 2012] [notice] Digest: done
[Thu Jun 28 01:10:29 2012] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations

No veo nada, entonces ahora viene ejecutar el comando phpinfo() en un archivo php:

phpinfo();
?>

Lo ejecutamos en el navegador y checan si todos los modulos aparecen, en mi casi si.

Listo hemos terminado.

Solo les debo recordar que segun los modulos que necesiten deben instalar las librerias que requieran sus paquetes y lo mismo sucede en los servidores de produccion donde los vayan a ejecutar.

Por ejemplo mi servidor tiene estos paquetes:

php53u.x86_64
php53u-cli.x86_64
php53u-common.x86_64
php53u-ldap.x86_64
php53u-mbstring.x86_64
php53u-mcrypt.x86_64
mysql51.x86_64
mysql51-libs.x86_64
mysql51-server.x86_64
mysqlclient15.x86_64
firebird.x86_64
firebird-classic.x86_64
firebird-filesystem.x86_64
firebird-libfbclient.i386
firebird-libfbclient.x86_64
firebird-libfbembed.x86_64
firebird-libfbclient.i386
firebird-libfbclient.x86_64
firebird-libfbembed.x86_64

Saludos!!!