- FreeTDS -
(PHP bajo Linux con SQL Server bajo Windows)
Iván Belmonte <ttyp0@inet2u.com - http://assl.ath.cx> - 25 de Junio de 2k2
______________________________________________________________________________
1. ¿FreeTDS?
2. Obtención de los fuentes y Documentación oficial
3. Compilar los fuentes
4. El fichero de configuración y el fichero interfaces
5. ¿Ya está todo?
5.1 Obtención de los fuentes de PHP
5.2 Documentación oficial de PHP
5.3 Compilar PHP
6. Rearranque del demonio de Apache
7. ¿¿Funciona??
______________________________________________________________________
1. ¿FreeTDS?
TDS (Tabular Data Stream) es el protocolo usado por Micro$oft en su servidor de bases de datos SQL Server, así como en Sybase. Es un protocolo que Linux por naturaleza no usa, dado que ninguna de las bases de datos libres erguidas sobre Linux lo necesita. Aun así, existen funciones en PHP para trabajar con bases de datos SQL Server y Sybase... pues bien, es porque existe una implementación libre del protocolo que necesitamos.
FreeTDS es un conjunto de librerías distribuidas libremente bajo licencia GNU/GPL, que nos permite comunicar PHP con las bases de datos antes mencionadas.
Este documento explica los pasos necesarios para compilar satisfactoriamente dichas librerías y comunicarse con una base de datos en SQL Server. Aun así, mi experiencia se reduce a un sistema Operativo Slackware GNU/Linux con PHP 4.2.0 y Apache 1.3.26... no sé en otro sistema operativo con diferentes versiones de las aplicaciones cómo funcionará.
2. Obtención de los fuentes y documentación oficial
La documentación oficial de FreeTDS podeis encontrarla aquí:
http://www.freetds.org/docs/
En esta sección de documentación os recomiendo leer tranquilamente el User Guide. Por otro lado, los fuentes podeis descargarlos de aquí:
http://www.freetds.org/software.html
3. Compilar los fuentes
Debemos desempaquetar los fuentes y, antes de nada, recomiendo leer el archivo INSTALL, que explica bien los pasos necesarios para la instalación.
También recomiendo ENCARECIDAMENTE leer lasalida del comando:
# ./configure --help
En la salida encontraremos las diversas opciones para su compilación. Yo las primeras veces he forzado la versión del TDS a 7.0, por ser la que utiliza el servidor de SQL Server con el que trabajo (Sql Server 7.0), pero despues me encontraba con limitaciones a la hora de editar los ficheros de configuración de FreeTDS, pues me faltaba justamente el fichero freetds.conf que configura los parámetros del servidor a conectar. De este modo, acabé por no especificar más que el path de la instalación:
# ./configure --prefix=/usr/local/freetds
# make
# make install
Al acabar no debería daros ningún problema. Si vais a compilar con soporte para iODBC o UnixODBC (gestores de conexión), pensad que necesitais los fuentes de ambas API's, y los debeis compilar primero (los fuentes están disponibles en el mismo sitio donde encontramos los de FreeTDS). Por otro lado, comento tambien que la versión de TDS a utilizar podemos especificarla luego en los ficheros de configuración sin ningún problema, y funciona igualmente (aunque por defecto diga que compila para tds 5.0 únicamente).
Una vez compilados los fuentes, debemos especificar un par de variables de entorno necesarias. Desde la shell (una bash por ejemplo) podemos hacerlo así:
# SYBASE=/usr/local/freetds
# LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$SYBASE/lib
# export SYBASE LD_LIBRARY_PATH
Podemos añadir la ruta a las librerías de FreeTDS en /etc/ld.so.conf (y ejecutando su correspondiente ldconfig despues), o podemos especificarlo desde la shell, es lo mismo, pero recordad que si lo haceis desde la shell luego debereis añadirlo al rc.local o su sustituto en otras distribuciones, para que se ejecute al arrancar el sistema.
4. El fichero de configuración y el fichero interfaces
El fichero de configuración de FreeTDS se encuentra en /usr/local/freetds/etc/freetds.conf.
Al editarlo vereis que contiene varias muestras de posibles casos, servidores SQL de Microsoft, segun si se autentifican mediante dominio, mediante autentificación de servidor, si son Sybase, etc. En mi caso particular la configuración es la de un SQL Server 7.0 simple:
[global]
tds version = 4.2
initial block size = 512
swap broken dates = no
swap broken money = no
try server login = yes
try domain login = no
nt domain = DOMINIO_NT
crosss domain login = no
[dataserver]
host = 192.168.1.17
port = 1433
tds version = 7.0
Por defecto, según parece, todos los servidores SQL Server escuchan el mismo puerto (1433) pero de todos modos podeis comprobarlo antes de echaros las manos a la cabeza porque no funciona. Simplemente telneteando el server a dicho puerto podreis saber si funciona (acepta la conexion) o no funciona (connection refused). En caso de que no funcione, podeis preguntar al administrador de vuestra red u buscarlo por otros métodos.
El fichero interfaces se usaba en lugar del fichero de configuración anteriormente explicado, aunque ahora se mantiene por compatibilidad con algunas versiones de Sybase. Se encuentra en /usr/local/freetds/interfaces , o debería encontrarse ahí. Si no está lo podemos crear nosotros mismos. SU formato es el siguiente:
dataserver2
query tcp 7.0 192.168.1.17 1433
master tcp ether 192.168.1.17 1433
Obviamente el 7.0 sabemos que se refiere a la versión de tds que use el server de SQL, y la dirección y el puerto son también lo del server.
Podeis tener tranquilamente conviviendo un fichero interfaces y un fichero freetds.conf (como tengo yo hahahaha), y no se daran de palos... eso sí, yo por precaución he llamado a las configuraciones por nombres diferentes, para evitar cosas raras.
5. ¿Ya está todo?
No. Aún falta recompilar PHP para especificarle la ruta hacia los drivers de conexión a Sybase (las librerías de FreeTDS).
5.1 Obtención de los fuentes de PHP
Los fuentes de PHP se pueden descargar de la siguiente dirección:
http://www.php.net/downloads.php
5.2 Documentación oficial de PHP
La documentación oficial de PHP se encuentra aquí:
http://www.php.net/docs.php
5.3 Compilar PHP
La compilación de PHP tiene usualmente un carro de configure que ocupa varias líneas (7 u 8) de shell, pero no debe asustaros. Podeis compilar simplemente siguiendo la configuración actual de vuestro módulo de php, añadiendo solamente el soporte para Sybase. Una configuración válida sería la siguiente:
# tar zxvfp php-4.2.0.tar.gz
# cd php-4.2.0/
# ./configure --prefix=/usr --with-apxs=/usr/sbin/apxs --with-mod_charset --enable-force-cgi-redirect --enable-discard-path --with-config-file-path=/etc/apache --enable-safe-mode --with-openssl --enable-bcmath --with-bz2 --enable-calendar --enable-ctype --with-gdbm --with-db2 --with-db3 --enable-dbase --enable-ftp --enable-gd-imgstrttf --with-gd=/tmp/gd-1.8.2 --with-jpeg-dir=/tmp/gd-1.8.2 --with-gmp --with-mysql=/usr --with-xml=shared --with-readline=/usr --with-mm=/usr --enable-trans-sid --enable-shmop --enable-sockets --with-regex=php --enable-sysvsem
--enable-sysvshm --enable-yp --enable-memory-limit --with-tsrm-pthreats --enable-shared --disable-debug --with-zlib=/usr --with-sybase=/usr/local/freetds
# make
# make install
6. Rearranque del demonio de Apache
Ya tenemos FreeTDS compilado, y PHP re-compilado con soporte para Sybase. Lo único que nos falta es matar y volver a lanzar el demonio de Apache (httpd). Podemos hacerlo mediante el script apachectl:
# apachectl stop
# apachectl start
7. ¿¿Funciona??
Podemos comprobar su correcto funcionamiento con una pequeña paginita que ejecute un query a una base de datos SQL Server. Un buen ejemplo sería algo así:
$db_conn = mssql_connect ("dataserver","lamer","lamepass") or die ("ERROR: fallo al establecer la conexion");
mssql_select_db ("database", $db_conn) or die ("ERROR: fallo al seleccionar la base de datos");
$query_result = mssql_query ("SELECT * FROM bogus", $db_conn) or die ("ERROR: fallo al ejecutar el query");
while ($result = mssql_fetch_array($query_result)){
echo $result["foo"]."<br>";
}
Obviamente, cambiad los nombres de las bases, del host y de los logins y passwords, por los vuestros. Si todo ha idobien, debería funcionar exactamente igual que un query a una MySQL (por ejemplo).
Las funciones para trabajar con los query's a SQL Server las podeis encontrar aquí:
http://www.php.net/manual/en/ref.mssql.php
8. Have Fun!
Si encuentras algún fallo en el documento puedes enviarme un email para notificármelo, lo modificaré de inmediato. Lo mismo digo si deseas aportar algo nuevo al documento (compilación con soporte iODBC o UnixODBC, por ejemplo).
Si necesitas ayuda específica sobre alguno de los puntos, te recomiendo que acudas a las personas de contacto de cada aplicación, ya que mi experiencia ha sido mínima, la justa para hacer funcionar el chiringuito bajo mis necesidades. Aun así, si tienes alguna duda sobre lo explicado, puedes dirigirte al weblog o a los foros de la ASSL (http://assl.ath.cx) o enviarme directamente un e-mail (mailto: ttyp0@inet2u.com).