15th Jan2013
Author: Gyro

Install php-gd on Ubuntu without recompiling php

For some reason one of my client's website stopped showing captcha codes for the mad4joomla component, the server is running nginx with php-fpm instead of Apache.

Looking at the error.log, I got

 [error] 21110#0: *100 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Call to undefined function imageantialias() in /var/www/clients/client1/web1/web/components/com_mad4joomla/sec/im4.php on line 39"

Time to check the server, that function is supposed to be part of the GD library.

First, I checked if GD was loaded:
# php5 -m | grep -i gd

gd

ok, so GD is there… now on to the function.

# php -r "var_dump( function_exists(‘imageantialias'));"

bool(false)

hmm… :wooty:

So, on I went to google, trying to find out how I can get imageantialias() to work (again)… to my surprise I actually stumbled upon a post talking about the exact same issue, while using the same server setup -- Ubuntu with ISP Config. The solution presented was to recompile php, which I was reluctant to do.

After some more searching I came across this amazing little page (http://nossie.addicts.nl/php5-gd.html) which I am going to post (slightly modified) right here, mainly because it looks like that page could be gone tomorrow…

Getting bundled php-gd working on Ubuntu without having to recompile php

Like many other people out there, I ran into the problem that the version of php-gd shipped with Ubuntu (and Debian) is different from the version used by many other distributions.
The version Ubuntu uses misses some functions like imagerotate and imageantialias, which are needed by an increasing number of software projects.

One solution to this problem is recompiling PHP with the bundled version of GD.
It is not particularly hard to do, but there are a reasons not to do it, one of them being that it is not neccesary.

The following steps solved the problem for me.

Install what is needed to do this:
# sudo apt-get install php5-cli php5-gd rpm mc

Check what version of php you are running (php5 -v). In my case it was 5.3.2-1ubuntu4.7
Go to rpmfind.net and search for php-gd-bundled
Download the version that matches your PHP version and architecture, php-gd-bundled-5.3.2-1mdv2010.1.x86_64.rpm in my case.

If you have installed mc (midnight commander) and rpm, you can use mc to open the downloaded .rpm file (start mc, goto the .rpm file and hit enter)
Inside the .rpm file you will see CONTENT.cpio, navigate to that and hit enter. Goto usr/lib64/php/extensions, there you will find gd-bundled.so.

The original php5-gd is installed at /usr/lib/php5/20090626/gd.so (for my installation), backup the original gd.so, and copy the gd-bundled.so to that location and rename to gd.so (you can copy files with F5 in mc).
The new gd.so expects to find libjpeg.so.8, this was not present on my system, but that can be sovled by creating a symlink from the installed libjpeg.so
On my system I found /usr/lib/libjpeg.so.64.0.0
Create the symlink with:
# ln -s /usr/lib/libjpeg.so.62.0.0 /usr/lib/libjpeg.so.8

This is it, restart apache and you should be running with the bundled version of gd.
# php -r "var_dump(function_exists(‘imageantialias'));"
Should return bool(true) this time.

Now, if there is an update of the php5-gd package, your modified version gets overwritten. To prevent this from happening, you can hold the php5-gd package so it will not be updated.
# aptitude hold php5-gd

I hope this will help you as much as it did me!

Enjoy :enjoy:

51161

Keep Me Going
Your Name / Website:
Did you like my post? Buy me a Bitcoffee! 14JX52Li7zTKbyQv2omw4tvu6Bi1KzfHNW



21 Responses to “Install php-gd on Ubuntu without recompiling php”

  • this is awesome; thank you so much!!! Worked like a charm.

  • Allan

    Lets see, install an rpm (redhat package manager) archive, on a ubuntu (dpkg based) system, from a random archive with no security signing, no md5 hashing or other basic safety and sanity checks.

    How about… No.

    I’ll surf on till I find a more sensible and safe solution.

    You don’t even mention that installing unsigned rpm’s or deb’s could potentially compromise your system, because unsigned means no accountability for the contents therein, and they could contain hidden shellcode, etc etc.

    • Gyro

      How about… reading the post.

      Nowhere does it say to install a rpm.

      A single file is needed to make this work, and you need to extract it from the rpm.

      The rpm in question is from an official Mandriva release.

      However, if you find a better solution, please leave another comment.

      Thanks :)

  • Arun

    I have a compiled version of PHP running with GD enables but freetype was missing at the time of compilation. Is there any way to add freetype support without recompiling PHP. I tried with using phpize, and comiled gd in ext folder, while loading the gd.so module in php.ini, it says gd already loaded. Any thoughts??

    • Gyro

      I think you will have to recompile php, the solution you tried would only work, if you had not included GD in the compile.

  • dakisan

    Thanks for reposting, I too found that op but as you’re on wordpress, I can converse:)

    Q: What if the version of php is newer than the newest gd rpm? For example, my php version is 5.5.9-1ubuntu4.6 and the most recent gd-php-bundled I can find dates to 5.4.

    • Gyro

      Assuming you use 14.04, make sure you have this ppa in your sources.list:

      deb http://ppa.launchpad.net/ondrej/php5/ubuntu trusty main
      deb-src http://ppa.launchpad.net/ondrej/php5/ubuntu trusty main

      once you do, you should be able to just apt-get install php-gd

      You can also download the package at: https://launchpad.net/ubuntu/utopic/amd64/php5-gd/5.5.9+dfsg-1ubuntu4

      • Hi. Thanks for a great post. Just like @dakisan above, I have PHP 5.5.9-1ubuntu4.9 installed.

        I added the Deb’s you mentioned, ran apt-get update and received the following error:

        W: GPG error: http://ppa.launchpad.net trusty Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY

        Would you have any ideas on how to solve this?

        Thank you.

        • I was able to go ahead and install GD by performing the following after adding the DEB’s above.

          Missing key: 4F4EA0AAE5267A6C

          ~$ sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 4F4EA0AAE5267A6C

          ~$ sudo apt-get update

          ~$ apt-get install php5-gd

          GD installed fine, but still no imageAntialias() unfortunately.

          • Gyro

            Hmm…

            did you do “ln -s /usr/lib/libjpeg.so.62.0.0 /usr/lib/libjpeg.so.8”, changing “/usr/lib/libjpeg.so.62.0.0” to whatever version you have installed?

            What does it say when you do: php -r “var_dump(function_exists(‘imageantialias’));”

          • Dmytro

            I also try update php5-gd from that repo. If I don’t change symlink from libjpeg8 to libjpeg62 – php -r “var_dump(function_exists(‘imageantialias’));” show false. But if i change simlink – apache can’t start with error in GD library (something about missed symbol 8). Do you have other ideas how to make antialiasing working on Ubuntu 14.04 ?

          • Gyro

            I would say you need to get libjpeg8.
            http://packages.ubuntu.com/search?keywords=libjpeg8

          • Dmytro

            It’s installed and correctly linked.
            aptitude search libjpeg | grep ‘i ‘
            i A libjpeg-turbo8 – IJG JPEG compliant runtime library.
            i libjpeg62 – Independent JPEG Group’s JPEG runtime libr
            i A libjpeg8 – Independent JPEG Group’s JPEG runtime libr

            aptitude show libjpeg8
            Package: libjpeg8
            State: installed
            Automatically installed: yes
            Multi-Arch: same
            Version: 8c-2ubuntu8
            Priority: optional
            Section: libs
            Maintainer: Ubuntu Developers
            Architecture: amd64
            Uncompressed Size: 26.6 k
            Depends: libjpeg-turbo8 (>= 1.1.90+svn722-1ubuntu6)
            Breaks: libjpeg8 (!= 8c-2ubuntu8)
            Replaces: libjpeg8 (< 8c-2ubuntu8)
            Description: Independent JPEG Group's JPEG runtime library (dependency package)
            libjpeg8 dependency package, depending on libjpeg-turbo8.

            aptitude show php5-gd
            Package: php5-gd
            State: installed
            Automatically installed: no
            Version: 5.5.26+dfsg-1+deb.sury.org~trusty+1
            Priority: optional
            Section: php
            Maintainer: Debian PHP Maintainers
            Architecture: amd64
            Uncompressed Size: 163 k
            Depends: libc6 (>= 2.4), libgd3 (>= 2.1.0), libxpm4, phpapi-20121212,
            php5-common (= 5.5.26+dfsg-1+deb.sury.org~trusty+1), ucf
            PreDepends: dpkg (>= 1.15.7.2~)
            Conflicts: php5-gd
            Description: GD module for php5
            This package provides a module for handling graphics directly from PHP scripts.
            It supports the PNG, JPEG, XPM formats as well as Freetype/ttf fonts.

            PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open
            source general-purpose scripting language that is especially suited for web
            development and can be embedded into HTML.

            ls /usr/lib/x86_64-linux-gnu/ -l | grep libjpeg
            lrwxrwxrwx 1 root root 17 Dec 11 2013 libjpeg.so.62 -> libjpeg.so.62.0.0
            -rw-r–r– 1 root root 150184 Dec 11 2013 libjpeg.so.62.0.0
            lrwxrwxrwx 1 root root 16 Jul 14 22:30 libjpeg.so.8 -> libjpeg.so.8.0.2
            -rw-r–r– 1 root root 281288 Dec 19 2013 libjpeg.so.8.0.2

            BUT, php -r “var_dump(function_exists(‘imageamtialias’));”
            bool(false)

          • Gyro

            Hi,

            if you have gone to rpm-find and downloaded a matching rpm, then manually copied and renamed gd-bundled.so to gd.so as described, then your issue seems to be unique and probably needs quite a lot of trial and error troubleshooting.

            This comment section is not the right place for troubleshooting individual issues though. Please use a forum or help site for that. Once you got it figured out, it would be great to hear the solution though, it may help others having the same issue as you.

            Good Luck! :)

  • Dmytro

    Hi,

    No, I don’t use rpm-find or something else :) I just add repo you advice and inform, that it’s not sovle the problem.

    Sorry for offtopic

    • Gyro

      Please read the original post, you missed an important step in the instruction and that is why imageantialias isn’t working for you.

      You HAVE TO go to rpm-find, download a rpm package and copy a certain file to make this work. That is why I asked, if you did that. ;)

  • Andrus

    Why does the rpmfind repo stop with PHP 5.3? I need something newer, so it’s looking like compiling PHP is the only solution.

    • Gyro

      Hi, when I search it goes up to 5.4 but try searching for “php-gd” instead, then download one that matches your php version. Haven’t tested it, but it should work.

  • ali

    { Download the version that matches your PHP version and architecture, php-gd-bundled-5.3.2-1mdv2010.1.x86_64.rpm in my case. }

    Problem is how to do that on a deb ubuntu system ?? i get..

    550 Failed to change directory

    please someone list the ALL the steps and commands for us less experience people to get this problem sorted once and for all.

    thank you in advance.

    • Gyro

      All steps are provide. As stated in the line above the one you quoted: “Go to rpmfind.net and search for php-gd-bundled”.

      Meaning, you open your web browser, visit http://www.rpmfind.net, enter “php-gd-bundled” in the search field, click search, and download the version that matches your installed php version… then continue following the steps.

      If you are doing this on a server that does not have a GUI, simply use another computer to find the matching RPM and either download the RPM and upload to the server, or write down the download URL and on the server do: wget [URL-TO-DOWNLOAD]

      In my example that would be
      wget ftp://195.220.108.108/linux/Mandriva/official/2010.1/x86_64/media/contrib/release/php-gd-bundled-5.3.2-1mdv2010.1.x86_64.rpm

      Only use my example, if you are using php version 5.3.2, else find the correct rpm on rpmfind.com

      Good Luck! :)

      p.s. If the web service running on the server is not mission critical – meaning it’s ok to be offline for an hour or so – then it would be much easier to just recompile php.

Leave a Reply

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

What is 14 + 4 ?
Please leave these two fields as-is:
IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)