Acceso a MSSQL Server desde PHP en un servidor Linux

El día de hoy realicé la actualización del servidor de desarrollo (OpenSuse 10.2) para soportar las conexiones a un servidor de bases de datos MS SQL Server 2005. El servidor de bases de datos se encuentra en la red privada (192.168.1.5). El servidor de desarrollo tiene dos interfaces, una de ellas es privada también (192.168.1.3). La versión de PHP que se encuentra actualmente instalada es la 5.2.0.

Actualicé algunos paquetes que eran necesarios para instalar el software FreeTDS.

# rpm -i readline-devel-5.1-55.i586.rpm
# rpm -i  libxml2-devel-2.6.26-26.i586.rpm
# rpm -i  libapr1-devel-1.2.7-23.i586.rpm
# rpm -i  libapr-util1-devel-1.2.7-26.i586.rpm
# rpm -i  apache2-devel-2.2.3-20.i586.rpm

Otros paquetes que puedan llegar a necesitarse se pueden descargar de la siguiente dirección.

http://download.opensuse.org/distribution/10.2/repo/oss/suse/i586/.

Descargué y descomprimí la última versión de FreeTDS.

# wget ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
# tar zxvf freetds-stable.tgz
# cd freetds-0.64

Se compila e instala en el directorio /usr/local/freetds-0.64 con soporte para la versión 8.0 del protocolo. Para consultar información adicional acerca del protocolo consulte la dirección siguiente: http://www.freetds.org/userguide/choosingtdsprotocol.htm.

# ./configure --prefix=/usr/local/freetds-0.64 --with-tdsver=8.0
# make
# make install

Creé un enlace dinámico desde /usr/local/freetds al directorio de instalación para facilitar el manejo de diferentes versiones en un futuro cercano cuando vaya a actualizar la librería.

# ln -s /usr/local/freetds-0.64 /usr/local/freetds

Edité el perfil general de los usuarios para añadir al final de este información de las variables de ambiente de FreeTDS .

# vi /etc/profile
###################################################
SYBASE=/usr/local/freetds
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$SYBASE/lib
export SYBASE LD_LIBRARY_PATH
###################################################

Descargué y descomprimí el código fuente de la versión de PHP instalada. Para descargar versiones históricas de PHP visite el siguiente enlace: http://www.php.net/releases/.

# wget http://museum.php.net/php5/php-5.2.0.tar.gz
# tar zxvf php-5.2.0.tar.gz
# cd php-5.2.0

Se crearon los scripts de compilación para realizar una instalación temporal en /root/tmp/php-5.2.0/installation y de allí obtener el módulo dinámico de soporte para MSSQL.

# SYBASE=/usr/local/freetds
# LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$SYBASE/lib

# export SYBASE LD_LIBRARY_PATH# ./configure --with-apxs2=/usr/sbin/apxs2 
--with-mssql=shared,$SYBASE 
--with-sybase=$SYBASE 
--with-libxml-dir=/usr/lib/ 
--prefix=/root/tmp/php-5.2.0/installation
# make

# make install

Se copió el módulo recién generado a la ubicación donde PHP almacena sus propios módulos.

# cp ./installation/modules/mssql.so /usr/lib/php5/extensions/
# chmod -x  /usr/lib/php5/extensions/mssql.so

Se creó el archivo mssql.ini para activar el módulo.

# vi /etc/php5/conf.d/mssql.ini
extension=mssql.so

Se reinicio el servicio de Apache2 para refrescar los cambios recién hechos.

# rcapache2 restart

Al consultar la información resultante de phpinfo ya aparece la sección de MSSQL.

Para realizar una prueba fiable de conexión entre PHP y MSSQL puede utilizar el script adjunto a continuación editando adecuadamente la información de conexión al inicio de este.

Enlace: prueba_mssql.php

19 thoughts on “Acceso a MSSQL Server desde PHP en un servidor Linux”

  1. Saludos,

    Amigo es que tengo esta situacion, tengo una tabla con un campo datetime y no tiene habilitado nulos en el campo, esto es porque estoy usando sugar crm y crea los campos datetime sin habilitar nulos, y tengo error al insertar en la tabla.

    Podrias ayudarme creando una tabla de prueba con un campo datetime y sin habilitar nulos y hacer un insert en la tabla desde php en linux a ver como te sale, gracias.

  2. Saludos,

    Es q lo que pasa es que SQL Server acepta desde linux la fecha en formato YYYY-DD-MM y no YYYY-MM-DD por eso esta saliendo el error, sabes mas o menos que podria ser en la configuracion.

    Me comentas, gracias.

  3. Gracias, si funciona cambiandole el dateformat, pero habrá alguna forma de que sea permanente?, alguna configuracion en FreeTds, el locales.conf lo he cambiado pero no resulta, si sabes algo te agradezco.

  4. Según el FAQ estás en lo correcto, el problema se debe a que el controlador elige por si mismo el formato de la fecha que se va utilizar. Mencionan también que Microsoft soluciona el problema de incompatibilidad de fechas en clientes lilttle-indian en el ServicePack 3, esto aplica según entiendo para la versión 7.0 del motor de base de datos.

    Si optas por la configuración de FreeTDS, el cambio debe realizarse donde mencionas, en locales.conf con la sintaxis de strftime.

    El dateformat que trae mi FreeTDS por defecto es el siguiente.

    [default]
    date format = %b %d %Y %I:%M%p

    FAQ: http://www.freetds.org/faq.html#dateformat
    Locales.conf:
    http://www.freetds.org/userguide/locales.htm
    Corrección cliente little-endian: http://support.microsoft.com/kb/q254123/
    Manual de strftime: http://man.cx/strftime(3)/es

  5. Traté por ahi con en locales.conf pero no funcionó, pero ya solucioné lo que quería, usando el SET DATEFORMAT en unas 2 lineas del CRM, muchas gracias por todo, hablamos.

  6. Hola, luego de ingresar

    ./configure –with-apxs2=/usr/sbin/apxs2
    –with-mssql=shared,$SYBASE
    –with-sybase=$SYBASE
    –with-libxml-dir=/usr/lib/
    –prefix=/root/tmp/php-5.2.0/installation

    obtengo el siguiente error:

    Configuring SAPI modules
    checking for AOLserver support… no
    checking for Apache 1.x module support via DSO through APXS… no
    checking for Apache 1.x module support… no
    checking for member fd in BUFF *… no
    checking for mod_charset compatibility option… no
    checking for Apache 2.0 filter-module support via DSO through APXS… no
    checking for Apache 2.0 handler-module support via DSO through APXS…

    Sorry, I cannot run apxs. Possible reasons follow:

    1. Perl is not installed
    2. apxs was not found. Try to pass the path using –with-apxs2=/path/to/apxs
    3. Apache was not built using –enable-so (the apxs usage page is displayed)

    The output of /usr/sbin/apxs2 follows:
    ./configure: 5772: /usr/sbin/apxs2: not found
    configure: error: Aborting

    He intentado corregirlo de todas las formas. pero no puedo, porfavor alguien puede ayudarme???

  7. Saludos @Jose.

    Empecemos por lo obvio para descartar trivialidades. Revisaste lo que sugiere el script ?

    1. Existe Perl. “which perl” retorna la ubicación ?
    2. La ruta de apxs2 es la real ? “ls -l /usr/sbin/apxs2” muestra la información del archivo ?
    3. Apache fue compilado con soporte para módulos dinámicos ? “httpd -l” muestra al módulo mod_so.c ?

    Si tu Linux es un Debian (probablemente también funcione con Ubuntu) este es un método mas sencillo de instalar FreeTDS/PHP mediante los repositorios.

    http://blog.jorgeivanmeza.com/2009/04/instalacion-de-freetds-para-el-acceso-a-mssql-desde-php-en-linux-debian-5/

  8. Hola, que tal. Te comento que reinstale el php5, tenia la version 5.1.2 e instale la 5.2.9 y toda la instalación corrio perfectamente pero cuando acceso al phpinfo.php me sigue saliendo los datos de la versión anterior. Que puedo hacer?

  9. Interesante. Yo intentaría descartar primero las opciones triviales.

    1. Limpia el caché del navegador y refrescalo con CTRL+F5.
    2. Desinstalaste la versión anterior de PHP ?
    3. Ubicar PHP y verificar su versión.

    $ which php
    /usr/bin/php (puede ser diferente en tu caso).

    $ /usr/bin/php -v

    Debería ser entonces la 5.2.9 que recién instalaste.

    4. Además de instalar PHP instalaste satisfactoriamente el módulo para el servidor de páginas ?

  10. @José Carlos, tal vez tienes la primera versión instalada como módulo y la segunda como CGI o viceversa. De esta manera sería necesario indicarle correctamente a Apache cual instancia de PHP utilizar.

    Para remover el PHP antíguo, supongo que la instalación del último PHP lo hiciste desde fuentes, la forma mas fácil es utilizar la herramienta de administración Yast!. De todas formas te sugiero que NO lo hagas hasta resolver el problema de PHP ya que corres el riesgo de quedarte sin soporte de páginas dinámicas hasta resolverlo.

  11. Hola, la primera instalacion asumo que fue con el yast y la segunda la ice complinado el php. Te comento que ya no tengo el Yast porque en plena instalacion me pidio reinstalar el cURL y por inexperiencia no tuve mejor idea que quitar el cURL el cual me advirtio que quitaria muchas partes del yast y como estoy tan urgido de que el php se conecte con mssql acepte y ahora no tengo Yast. Porfavor indicame como debo hacer para que apache corra con la ultima version del php. Gracias de antemano

  12. Bien, se me ocurren varias opciones para probar.

    Lo mejor sería revisar qué módulos de PHP5 tienes y cuales estás cargando.

    1. Como root ejecuta el siguiente comando.

    find / -name libphp5.so

    Revisa las fechas de los archivos (espero que salgan dos, la nueva y la anterior) para saber cual es la nueva versión.

    2. Busca en la configuración del Apache donde estás haciendo el LoadModule del libphp5.so y verifica que sea el de la ruta adecuada.

    Para mi caso esto se hace en /etc/apache2/mods-enabled/php5.load pero ten encuenta que estoy utilizando un Ubuntu en lugar de un Suse.

  13. me salen 3 archivos:
    /usr/local/apache2/modules/libphp5.so
    /root/php-5.2.9/.libs/libphp5.so
    /root/php-5.2.9/libs/libphp5.so, ninguno me sale con fecha. El siguiente comando que me diste no me funciona, que puedo hacer cualqueir cosa mi mail directo es jcchavezs[a]gmail.com Gracias por la ayuda.

  14. al darle el comando export ./configure me sale un error que dice ./configure:not a valid identifier ..
    no se por que ..y n ohe logrado que se conecte a sql server … les agradesco cual quier ayuda ..

  15. La version es opensuse 11 ..y no he podido lograr que el php5 reconosca las instrucciones mssql ..

    si yo descargue php5 ..como esta en las instrucciones y ingrese en el directorio y de ahi ejecuto el comando ..

    ./configure –with-apxs2=/usr/sbin/apxs2
    me sale not a valid identifier .. yo busque el archivo apxs2 haber si esta en otra ruta ..pero no lo encuentro .. que debo de hacer ..?

    muchas gracias por cualquier ayuda .. estoy desesperado ..

Leave a Reply

Your email address will not be published. Required fields are marked *