PHP MSSQL para Centos 4

Uno de mis temas “favoritos” es el soporte SQL server bajo PHP en Linux. Por motivos que no tengo bien claros y imagino que es debido al tema de licencias GPL y demás, en las distribuciones de PHP para Linux no viene activado el soporte “mssql”, es decir, la capacidad de conexión a SQL server con PHP. Hay varios tutoriales muy útiles con sólo hacer una búsqueda y sin ellos no habría encontrado nunca la solución a mi problema, que era un “pelín” más complicado. Además de tener en cuenta la distribución, php, etc, yo tenía un compañero de viaje más, el panel de control Plesk. Lo positivo de la situación fue que, estando en un entorno Parallels, las tareas de backup y clon de containers me dio la seguridad total de volver a estados pasados con un par de clicks y total rapidez.

Primero miramos nuestra distribución y php que tenemos en nuestra máquina:

# cat /etc/redhat-release

CentOS release 4.6 (Final)

# rpm -q php

php-4.3.9-3.22.9

Resumen:

Sistema: Linux – Virtualización Parallels

Distro: Centos 4.6

Kernel: 2.6.18 Parallel

Hacemos phpinfo y vemos que no tiene soporte mssql (o, mai got). Como paso previo nos aseguramos tener un compilador para c:

# yum install gcc

Descargar freetds y instalar:

# wget ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/
freetds-stable.tgz

# gunzip freetds-stable.tgz

# tar xf freetds-stable.tar

# cd freetds-stable-0.64/

# ./configure --prefix=/usr/local/freetds
--with-tdsver=8.0 --enable-msdblib --enable-dbmfix --with-gnu-ld

# make

# make install

Es muy importante la ubicación de la instalación de freetds. Porque como se puede leer en un artículo de Brassy.net es crucial el directorio donde se instala. De hecho, aconseja no utilizar los rpms de FreeTDS que están disponibles desde el repositorio de rpmforge. Ahora tendremos que probar la conexión al servidor SQL:

# tsql -S <IP servidor bd> -U <username> -P <password>

Si podemos conectarnos, podemos seguir adelante. Sino, hemos de repasar porque no se establece la conexión con el servidor de base de datos. En este momento, nuestro sistema tiene soporte para SQL, pero otra historia es recompilar el php para activar ese soporte. Let’s go.

Ahora tenemos que buscar el archivo php.SPEC, donde está la información necesaria para compilar de nuevo el php. Puede que no lo tengamos en nuestra máquina. En ese caso, debemos bajarnos un .rpm. Vamos concretar la situación en la que nos encontramos. Estamos ante una máquina Centos 4.6 64bits con un Plesk ya instalado y funcionando. Debemos, de alguna manera, recompilar ese paquete de php para incluir la extensión mssql. El problema que tenemos es que no tenemos ese archivo SPEC para trabajar, no se encuentra en la máquina. Quizá quieras probar la opción de bajarte el rpm del paquete php-mssql*.rpm que encuentres en algunos repositorios. Es una opción que descarté porque la instalación de un rpm en particular te devuelve siempre errores de dependencia que no son fáciles de solucionar. Implica actualizar más y más paquetes del sistema. Un infierno.

Necesitaremos bajarnos el archivo fuente de php, que creará un árbol de directorios con todo lo necesario para compilar la extensión. Aviso que me dio varios problemas. Quizá alguno no entienda el tema del Plesk en esto y porque digo que molesta a la hora de activar el soporte. Bien, Plesk instala varios paquetes relacionados con php. Entendemos que debemos dar los menos pasos o acciones posibles para activar ese soporte y que no deje de funcionar el Plesk, porque los clientes o personas que lo usan se pueden enfadar bastante. Lo primero que piensas es, “desinstalo el php, me lo bajo y lo compilo”. Pero al hacer un:

# yum remove php

Removing:
php x86_64 4.3.9-3.22.9 installed 3.6 M
Removing for dependencies:
psa x86_64 8.3.0-cos4.build83071218.18 installed 75 M
psa-api noarch 8.3.0-cos4.build83080131.20 installed 3.9 M
psa-api-rpc noarch 8.3.0-cos4.build83080131.20 installed 1.2 M
psa-awstats-configurator noarch 1.0.0-cos4.build83071218.18 installed 0.0
psa-horde noarch 3.1.5-cos4.build83071218.18 installed 23 M
psa-hotfix3 x86_64 8.3.0-cos4.build83080109.18 installed 23 M
psa-hotfix4 x86_64 8.3.0-cos4.build83080131.20 installed 662 k
psa-imp noarch 4.1.5-cos4.build83071218.18 installed 14 M
psa-ingo noarch 1.1.4-cos4.build83071218.18 installed 3.9 M
psa-kronolith noarch 2.1.6-cos4.build83071218.18 installed 5.2 M
psa-libpam-plesk x86_64 8.3.0-cos4.build83071218.18 installed 155 k
psa-manual-custom-skin-guide noarch 8.3.0-cos4.build83071218.18 installed 568 k
psa-migration-manager x86_64 8.3.0-cos4.build83080131.20 installed 7.5 M
psa-mimp noarch 1.0.2-cos4.build83071218.18 installed 2.0 M
psa-mnemo noarch 2.1.1-cos4.build83071218.18 installed 3.1 M
psa-passwd noarch 3.0.1-cos4.build83071218.18 installed 3.2 M
psa-php4-configurator noarch 1.3.0-cos4.build83071218.18 installed 0.0
psa-turba noarch 2.1.5-cos4.build83071218.18 installed 5.2 M
psa-updates noarch 8.3.0-cos4.build83080131.20 installed 0.0

….

etc

En efecto, también se tendrían que eliminar muchos paquetes que Plesk utiliza y al hacer esto, Plesk deja de ir, con lo cual no es una solución. Estamos pues en entorno Centos 4.6. Vamos a intentar recompilar ese php para que pueda funcionar con una extension mssql.

# yum -y install rpm-build

Siguiente paso, descargarse el SRPM (Source RPM) de nuestra versión de php.

# cd /usr/local/src/

# wget http://mirror.centos.org/centos-4/4.6/os/
SRPMS/php-4.3.9-3.22.9.src.rpm

# rpm -i php-4.3.9-3.22.9.src.rpm

Esto creará dentro un árbol de directorios en /usr/src/redhat, con los datos que necesitamos. Localizamos el archivo php.spec

# locate php.spec

nos puede salir esta advertencia:

warning: locate: warning: database /var/lib/slocate/slocate.db’ is more than 8 days old

Ejecutamos

# updatedb

y nos mostrará la ruta del php.spec.

/usr/src/redhat/SPECS/php.spec

Con un editor de texto debemos modificar ese archivo.

Añado dentro de php.spec

%package mssql
Group: Development/Languages
Requires: php = %{version}-%{release}, php-pdo
Summary: A module for PHP applications that use the MSSQL database.
provides: php_database
BuildRequires: freetds-devel

%description mssql
The MSSQL package contains a dynamic shared object that will add
support for accessing MSSQL databases to php.

y ejecuto

# rpmbuild -bb ./php.spec

Y me sale:

bzip2-devel se necesita para php-4.3.9-3.22.9.x86_64
curl-devel >= 7.9 se necesita para php-4.3.9-3.22.9.x86_64
gmp-devel se necesita para php-4.3.9-3.22.9.x86_64
aspell-devel >= 0.50.0 se necesita para php-4.3.9-3.22.9.x86_64
libjpeg-devel se necesita para php-4.3.9-3.22.9.x86_64
libpng-devel se necesita para php-4.3.9-3.22.9.x86_64
pam-devel se necesita para php-4.3.9-3.22.9.x86_64
libstdc++-devel se necesita para php-4.3.9-3.22.9.x86_64
gcc-c++ se necesita para php-4.3.9-3.22.9.x86_64
openssl-devel se necesita para php-4.3.9-3.22.9.x86_64
zlib-devel se necesita para php-4.3.9-3.22.9.x86_64
libtool >= 1.4.3 se necesita para php-4.3.9-3.22.9.x86_64
krb5-devel se necesita para php-4.3.9-3.22.9.x86_64
libc-client-devel se necesita para php-4.3.9-3.22.9.x86_64
mysql-devel se necesita para php-4.3.9-3.22.9.x86_64
postgresql-devel se necesita para php-4.3.9-3.22.9.x86_64
unixODBC-devel se necesita para php-4.3.9-3.22.9.x86_64
freetds-devel se necesita para php-4.3.9-3.22.9.x86_64
net-snmp-devel se necesita para php-4.3.9-3.22.9.x86_64
elfutils-devel se necesita para php-4.3.9-3.22.9.x86_64
libxslt-devel >= 1.0.18-1 se necesita para php-4.3.9-3.22.9.x86_64
libxml2-devel >= 2.4.14-1 se necesita para php-4.3.9-3.22.9.x86_64
ncurses-devel se necesita para php-4.3.9-3.22.9.x86_64
freetype-devel se necesita para php-4.3.9-3.22.9.x86_64

Instalamos todo el carro de dependencias que el rpm solicita con Yum. Una vez lo tengamos todo, volvemos a repetir el proceso. Es recomendable detener el Plesk, porque la cpu estará unos minutos compilando. Ocupará un buen rato pues ha de compilar varias cosas y hacer test de error. En mi caso, me devolvió un error bastante raro que apenas si tiene resultados en google con lo cual era casi imposible de reparar. Lo que hice fue ignorarlo y seguir adelante con el tutorial de instalación. Lo siguiente era ejecutar el comando phpize. El error en cuestión:

make: *** [test] Error 1
+ set +x
>> TEST FAILURE: ../ext/dba/tests/dba_flatfile.diff --
006- Content 2 replaced 2nd time
006+ Content 2 replaced
008- array(3) {
008+ array(4) {
012- string(27) "Content 2 replaced 2nd time"
012+ string(18) "Content 2 replaced"
013- ["key5"]=>
013+ ["key4"]=>
014- string(23) "The last content string"
014+ string(22) "Another Content String"
015- }
015+ ["key5"]=>
016+ string(23) "The last content string"
017+ }
<< ../ext/dba/tests/dba_flatfile.diff result ends.
error: Estado de salida erróneo de /var/tmp/rpm-tmp.5268 (%check)

Como digo, ignoramos este error y seguimos adelante.

# cd /usr/src/redhat/BUILD/php-4.3.9-3.22.9/ext/mssql/

# phpize

# ./configure --with-mssql

# make

# make install

En el proceso de ejecución del configure, recibí otro bonito error. Al parecer, el configure no encontraba el path de instalación del freetds. Si recuerdas, lo hemos instalado en /usr/local/freetds. Antes de poder instalarlo bien, me maté varias veces a probar de instalar el freetds. Pero al ejecutar el ./configure, siempre el mismo error:

error: Cannot find FreeTDS in known installation directories

Con un editor de texto editamos el configure. Buscamos por “FreeTDS”, una línea con lo siguiente:

FREETDS_INSTALLATION_DIR=""

Modificamos ese valor por el path actual donde sabemos está instalado FreeTDS. Volvemos a ejecutar el configure. Aparecerá otro error, relativo a una libreria.

configure: error: Could not find /usr/local/freetds/lib/libtds.a

Copiamos la librería a donde toca

# -bash-3.00# find / -name "libtds.a"
# /root/freetds-0.82/src/tds/.libs/libtds.a
# /usr/lib64/libtds.a
# -bash-3.00# cp /usr/lib64/libtds.a /usr/local/freetds/lib/

y compilamos

# make
# make install

El paso final es simplemente, copiar la mssql.so (que se encuentra en el directorio /usr/lib64/php4/) al directorio correspondiente y añadir la extensión en el php.ini

extension_dir = /usr/lib64/php4
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
; extension=modulename.extension
;
; For example:
;
; extension=msql.so
;
; Note that it should be the name of the module only; no directory information
; needs to go here. Specify the location of the extension with the
; extension_dir directive above.
extension=mssql.so

Resultado final

Después de rebotar apache, debemos tener Plesk funcionando con php y soporte mssql. Al hacer un phpinfo debermos ver esto:

mssql php

Fuentes:

http://www.brassy.net/2007/apr/using_mssql_php_centos_4_4

http://thim.trinix.be/2007/06/06/centos-5-install-php-mssql-module-extension/

http://www.electrictoolbox.com/install-php-mssql-centos-5/

http://www.howtoforge.com/installing_php_mssql_centos5.0

Links:

http://mirror.centos.org/centos-4/4/os/SRPMS/

http://dag.wieers.com/rpm/packages/freetds/

Leave a Reply

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