Introducción
Ubuntu es un sistema operativo muy popular, en estos últimos años ha crecido muchísimo en popularidad por ser un sistema operativo estable confiable y con actualizaciones regulares. Su popularidad ha crecido mucho no solo en los sistemas de escritorios y portátiles sino también en los servidores Web, sin embargo, hay que admitir que a veces Canonical tiene algunas fallas, a veces dejan por fuera de sus repositorios software muy útil, otras veces empaquetan mal o de manera extraña y otras veces no ponen en sus repositorios las versiones más actualizadas del software.
Este es el caso de la librería gd para PHP. La librería gd es una librería gráfica que proporciona varias funciones como escalado, rotación, recortado y otras más. Algunos plug-ins con efectos especiales gráficos como el ImageFlow utilizan esta librería para lograr los efectos especiales, como el reflejo en las imágenes, adicionalmente, algunos CMS(s) como Drupal utilizan este plug-in para crear galerías fotográficas.
El ImageFlow necesita de la versión 2.0.1 de la librería gd para funcionar y cuando no la encuentra no funciona en lo absoluto, en lugar de imágenes recibimos un mensaje como este:
ImageFlow requires GD 2.0.1 or higher (2.0.28 recommended)
El problema es que en los sistemas Ubuntu, aún en la última versión (11.04) la librería gd que se instala al instalar el paquete php5-gd es la 2.0 y por más que corramos apt-get updrade nunca obtendremos una versión más actualizada de la librería ya que canonical no la ha actualizado.
Al buscar a través de la red hay un montón de personas que preguntan como pueden solucionar este problema, no solo en los foros de ubuntu sino en otros lugares. Hay por ahí algunas soluciones que consisten en agregar los repositorios de debian al sources.list e instalar php5-gd desde ahí. El problema es que las dependencias en los repositorios de debian no son iguales a las de los repositorios de ubuntu y a veces hacer eso resulta en cosas que dejan de funcionar, como el Plesk por que al instalar php5-gd se cambian otros paquetes.
Adicionalmente al instalar desde los repositorios de debian nos podemos encontrar con mensajes como este:
Problemas de dependencias: php5-gd depende de libjpeg > 15b pero 15bubuntu1 será instalada E: Paquetes rotos
Obviamente tenemos una librería funcional pero el problema es que el dpkg falla al comparar las versiones y por eso la instalación puede simplemente fallar, y aunque podríamos forzar la instalación desde el apt-get esto podría llevarnos a tener problemas después. Podríamos tirarnos los repositorios o hasta terminar con un php que no funciona en absoluto.
Yo he encontrado una solución que funcionó muy bien para mi y por eso quiero compartirla con la comunidad ubuntu. Espero les funcione igual de bien que a mi, aquí vamos:
Actualizar la librería gd
Desinstalar la versión actual de php5-gd
Lo primero que haremos es desinstalar la versión actual de php5-gd, si ya tenemos alguna instalada, para saber si hay una instalada podemos usar este comando:
dpkg --get-selections | grep php5-gd
A lo que el sistema responderá con:
php5-gd install
Si el comando anterior no muestra ninguna salida significa que no tienes instalada la librería php5-gd por lo que podrás continuar con el siguiente paso. Si está instalada deberás desinstalarla por completo haciendo uso del siguiente comando:
sudo apt-get --purge remove php5-gd
Cuando desinstales la librería el sistema te dirá que hay ciertos paquetes que se instalaron con ella y que ya no son necesarios y te sugerirá que corras apt-get autoremove para quitarlos, NO LO HAGAS, deja los paquetes ahí por que igual vamos a instalar luego la librería gd nuevamente así que probablemente serán necesarios.
Instalar Alien
Alien es una utilidad especial que se puede instalar en los sistemas linux que utilizan sistemas de paquetes y que permite convertir paquetes deb (de debian) a rpm (de RedHat y SuSe) y viceversa, vamos a emplear esta utilidad, así que la instalamos así:
sudo apt-get install alien
Una vez está instalado Alien estamos listos para ir a buscar la librería gd actualizada.
Obtener una versión actualizada de la librería gd:
El sistema operativo CentOS que es una ramificación de RedHat si tiene la versión actualizada de la librería gd por lo que usaremos los paquetes de este sistema operativo para traer una versión actualizada a la librería a nuestro ubuntu. Lo primero que necesitamos saber es que versión de php5 tenemos, para lo cual ejecutamos:
sergio@fate:~$ php --version PHP 5.3.2-1ubuntu4.8 with Suhosin-Patch (cli) (built: Apr 27 2011 05:07:22) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies sergio@fate:~$
Vemos que es la 5.3.2, ahora vamos a ir a visitar el repositorio de paquetes de CentOS y vamos a buscar la librería gd adecuada para nuestra versión de php5. Usamos el search para localizar el paquete php5-gd correcto para nuestra versión de php5 y nuestra arquitectura (32 o 64 bits) y lo descargamos, en mi caso;
wget ftp://ftp.icm.edu.pl/vol/rzm1/linux-opensuse/distribution/11.3/repo/oss/suse/i586/php5-gd-5.3.2-1.31.i586.rpm
Lo que obtendremos será un paquete .rpm. Ahora debemos usar el alien para convertirlo a un paquete .deb, para lo cual:
sudo alien -d php5-gd-5.3.2-1.31.i586.rpm
Alien procesará el paquete y lo convertirá a un paquete .deb:
php5-gd_5.3.2-2.31_i386.deb generatedAhora debemos instalarlo como cualquier paquete debian corriente:
sudo dpkg -i php5-gd_5.3.2-2.31_i386.deb
La organización de las extensiones de PHP 5 es un poco diferente entre ubuntu y CentOS, así que deberemos mover la librería al lugar correcto para que funcione con el PHP, lo hacemos así:
sergio@fate:~$ cd /usr/lib/php5 sergio@fate:/usr/lib/php5$ ls 20090626+lfs extensions libexec maxlifetime sergio@fate:/usr/lib/php5$ cd extensions sergio@fate:/usr/lib/php5/extensions$ ls gd.so sergio@fate:/usr/lib/php5/extensions$ sudo mv gd.so ../20090626+lfs/gd.so
Básicamente, aquí lo que hemos hecho es mover la librería gd.so del directorio extensions al directorio 20090626+lfs que es donde ubuntu almacena las extensiones de php5
Terminar la instalación
Bien, ya tenemos instalada una versión reciente de la librería gd, pero aún no es totalmente funcional, ahora debemos encargarnos de algunos detalles que surgen como resultado de usar paquetes de otro sistema operativo.
Para el siguiente paso debemos asegurarnos de que PHP esté registrando los errores en un archivo de registro que podamos consultar, para ello, vamos a /etc/php5/apache2 y abrimos el archivo php.ini
Allí buscamos una línea como esta:;error_log = php_errors.logLe retiramos el punto y coma (;) al inicio de la línea y colocar allí la ruta a un archivo donde se escribirá el registro de los errores de PHP, por ejemplo:
error_log = /var/log/php5/errors.log
Guardamos el archivo, luego debemos asegurarnos de que el Apache pueda escribir en el archivo que hemos elegido:
sergio@fate:/etc/php5/apache2$ cd /var/log sergio@fate:/var/log$ sudo mkdir php5 sergio@fate:/var/log$ cd php5 sergio@fate:/var/log/php5$ sudo touch errors.log sergio@fate:/var/log/php5$ sudo chmod o+w errors.log sergio@fate:/var/log/php5$
Ahora reiniciamos el apache y consultamos el archivo de registro de errores:
sergio@fate:/var/log/php5$ sudo /etc/init.d/apache2 restart * Restarting web server apache2 ... waiting [ OK ] sergio@fate:/var/log/php5$ tail errors.log [30-Apr-2011 22:19:44] PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626+lfs/gd.so' - libpng14.so.14: cannot open shared object file: No such file or directory in Unknown on line 0 sergio@fate:/var/log/php5$
Allí vemos que hay un error, nos dice que nos hace falta la librería libpng14.so.14, vamos a ir a buscarla al repositorio de CentOS. Allí usamos el search con la opción Search for rpms which contain given file name (1) e.g. libhistory.so para localizar el paquete con la librería que necesitamos.
Una vez lo ubiquemos seleccionamos el paquete correcto para nuestra arquitectura (32 o 64 bits) y descargamos el paquete como antes:
wget ftp://mirror.switch.ch/pool/1/mirror/opensuse/distribution/11.4/repo/oss/suse/i586/libpng14-14-1.4.4-2.1.i586.rpm
Obtendremos el RPM y nuevamente usamos el Alien para convertirlo a un paquete de debian:
sudo alien -d libpng14-14-1.4.4-2.1.i586.rpm ... libpng14-14_1.4.4-3.1_i386.deb generatedLuego instalamos la librería:
sudo dpkg -i libpng14-14_1.4.4-3.1_i386.deb
Luego de esto reiniciamos el apache y comprobamos nuevamente el archivo de errores del PHP. Si encontramos otra librería que haga falta tendremos que repetir el procedimiento anterior para instalarla. Cuando el PHP no presente más errores habremos terminado con la instalación.
Comprobar la instalación:
Ahora comprobamos la instalación usando la función phpinfo y verificamos que la librería gd instalada sea la 2.0.34:
GD Support | enabled |
GD Version | bundled (2.0.34 compatible) |
FreeType Support | enabled |
FreeType Linkage | with freetype |
FreeType Version | 2.3.12 |
T1Lib Support | enabled |
GIF Read Support | enabled |
GIF Create Support | enabled |
JPEG Support | enabled |
libJPEG Version | unknown |
PNG Support | enabled |
libPNG Version | 1.4.3 |
WBMP Support | enabled |
XPM Support | enabled |
XBM Support | enabled |
Conclusión
Usando la utilidad Alien hemos logrado actualizar la librería gd para php. Hasta que canonical actualice la versión de los repositorios de ubuntu esta es una buena forma de quitarnos el problema de encima.
Espero que esta entrada les haya sido de mucha utilidad. Para mi significó un día entero de trabajo buscando la manera de actualizar la librería.