Universitat d'Alacant / Universidad de Alicante

Cómo acceder desde PHP en LiNUX a una Base de Datos MS SQL Server en NT, utilizando software GPL

    Hay varias formas de lograr conectar desde PHP en una máquina LiNUX a una BD MS SQL Server corriendo sobre NT. En este artículo de PHPBuilder se detallan algunas de estas formas, la mayoría de ellas utilizando unixODBC y alguna librería comercial. Aquí expondremos los pasos seguidos en el Departamento LiNUX del Laboratorio Multimedia de la Universidad de Alicante para conseguir acceder a MS SQL Server 7.0 utilizando únicamente software con licencia [L]GPL.

    La máquina donde realizamos estas pruebas corría Debian Potato 2.2 con las últimas actualizaciones de seguridad (línea "deb http://security.debian.org/ potato/updates main contrib non-free" en /etc/apt/sources.list), por lo que en lugar del PHP 4.0b3 que viene en Potato utilizamos PHP 4.0.3pl1 tras actualizar el sistema utilizando apt. Puede que algunos de los pasos aquí descritos no funcionen correctamente en otras distribuciones de LiNUX o con otras versiones de PHP.

    En nuestra solución, en lugar de ODBC utilizamos una librería para acceder a la base de datos utilizando directamente el protocolo de red utilizado por MS SQL y Sybase (MS compró a Sybase su base de datos para desarrollar MS SQL), conocido como TDS (Tabular DataStream). Hay varias librerías de acceso a TDS comerciales o gratuitas bajo licencias no libres para LiNUX y otros UNIX, pero en nuestro caso utilizamos FreeTDS que se distribuye bajo la licencia LGPL.

    Utilizando esta librería en lugar de unixODBC y un driver para MS SQL o Sybase obtendremos mayor velocidad (trabajamos directamente sobre el protocolo nativo de la BD, no sobre varias capas de drivers y protocolos ODBC) y la instalación será bastante más sencilla.

    Veamos por partes como proceder a la instalación:

  • Instalar PHP 4 en nuestro equipo

En el caso de Debian Potato, esto se puede realizar seleccionando el paquete php4 en dselect o bien con apt haciento "apt-get install php4" desde línea de comandos.

  • Obtener el código fuente de PHP 4

En Debian no hay ningún paquete con la extensión para acceder a Sybase desde PHP 4, así que vamos a tener que compilarlo nosotros. Hacer "apt-get source php4".

  • Descomprimir y parchear PHP 4

apt-get nos habrá descargado tres ficheros: php4_4.0.3pl1.orig.tar.gz, php4_4.0.3pl1-0potato1.diff.gz y php4_4.0.3pl1-0potato1.dsc. Descomprimir php4_4.0.3pl1.orig.tar.gz en algún directorio de trabajo (p.ej. en /usr/src) y aplicarle el parche php4_4.0.3pl1-0potato1.diff.gz.

  • Obtener el código fuente de la librería FreeTDS

Descargar el código de http://www.freetds.org. La versión que utilizamos en nuestra prueba fue la 0.51, con cualquier versión posterior debería funcionar también sin problemas.

  • Instalar FreeTDS

Descomprimir el código de FreeTDS y compilar e instalar con "./configure --with-tdsver=7.0 && make && make install". Debemos indicar la versión del protocolo TDS (opción --with-tdsver) que corresponda con nuestro servidor MS SQL Server.

  • Añadir el directorio de FreeTDS a ld.so.conf

Para hacer las librerías de FreeTDS accesibles a los programas de nuestro sistema, tendremos que añadir el directorio /usr/local/freetds/lib al fichero /etc/ld.so.conf y hacer "ldconfig".

  • Configurar el código de PHP

Ir al directorio donde se descomprimió el código de PHP y hacer "./configure --with-sybase=shared,/usr/local/freetds".

  • Compilar la extensión de Sybase

En lugar de compilar todo PHP, compilaremos sólo el módulo de Sybase y lo instalaremos manualmente. Para esto, vamos al directorio ext/sybase dentro del código de PHP y ejecutamos "make". Esto creará un subdirectorio .libs con la extensión php_sybase_db.so, que habrá que copiar en /usr/lib/php4/apache y añadir como extension en /etc/php4/apache/php.ini.

  • Volver a enlazar la extensión Sybase

En nuestro caso, el fichero php_sybase_db.so obtenido tras el paso anterior no funcionó correctamente. Al intentar reiniciar Apache (y con él, PHP con la nueva extensión activa) obteníamos un error "undefined symbol: dbinit" al intentar PHP cargar el módulo, ya que no se enlazó correctamente con la libraría FreeTDS. Para enlazarlo tendremos que hacer esto en el directorio ext/sybase (es una sóla línea):

/bin/sh /usr/src/php4-4.0.3pl1/libtool --silent 
--mode=link gcc -L/usr/local/freetds/lib -lsybdb -I.
-I/usr/src/php4-4.0.3pl1/ext/sybase
-I/usr/src/php4-4.0.3pl1 -I/usr/src/php4-4.0.3pl1/main
-I/usr/include/apache-1.3 -I/usr/src/php4-4.0.3pl1/Zend
-I/usr/src/php4-4.0.3pl1 -I/usr/include/db1 
-I/usr/include/mysql -I/usr/local/include 
-I/usr/include/ucd-snmp -I/usr/local/freetds/include
-I/usr/include/xmltok -I/usr/src/php4-4.0.3pl1/TSRM 
-DEAPI -DXML_BYTE_ORDER=12 -g -O2   -o php_sybase_db.la
-avoid-version -module 
-rpath /usr/src/php4-4.0.3pl1/modules  php_sybase_db.lo
  • Instalar manualmente la extensión Sybase

Copiaremos el fichero .libs/php_sybase_db.so en /usr/lib/php4/apache y añadiremos la línea "extension=php_sybase_db" en /etc/php4/apache/php.ini.

  • Reiniciar el servidor Apache

Por último, reiniciaremos el servidor Apache con "apachectl restart".



    Una vez hecho esto y si todo ha ido bien, ya podemos acceder directamente a nuestro servidor MS SQL Server utilizando la familia de funciones sybase_*().



Página mantenida por el Laboratorio de Multimedia
Última actualización: 01-Dic-2000
Página principal MMLAB