2011-05-01

PHP: gd library > 2.0 (2.0.1 / 2.0.34) en Ubuntu

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 generated
Ahora 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.log
Le 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 generated
Luego 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 Supportenabled
GD Versionbundled (2.0.34 compatible)
FreeType Supportenabled
FreeType Linkagewith freetype
FreeType Version2.3.12
T1Lib Supportenabled
GIF Read Supportenabled
GIF Create Supportenabled
JPEG Supportenabled
libJPEG Versionunknown
PNG Supportenabled
libPNG Version1.4.3
WBMP Supportenabled
XPM Supportenabled
XBM Supportenabled

 

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.