Guzei.com

Подключение GD2 к PHP

Пошаговое описание (инструкция) подключения графической библиотеки GD (GD2) к PHP

Статьи

© 2007, Игорь Гузей (Guzei.com.

Задача: Добавить в PHP поддержку/модуль GD2

Как обычно начинаем тренироваться на локальном компьютере, а он, конечно, работает под виндами. Точнее Windows XP SP2. Далее подключим GD2 в PHP, настроенном через порты или собранным вручную под FreeBSD.

Подключение GD2 к PHP под Windows

Находим в дистрибутиве:
\php-4.3.9-Win32.zip\php-4.3.9-Win32\extensions\
библиотеку php_gd2.dll, т.е. версию 2.
и копируем php_gd2.dll в c:\windows
в файле c:\windows\php.ini находим строку extension=php_gd2.dll и убираем комментарий.
Перегружаем Апач. Всё.

Если наивным образом сначала убрать в php.ini комментарий и думать, что этого достаточно, то после перезагрузки Апача появится диагностика:
"Unable to load dynamic library './php_gd.dll' - Не найден указанный модуль."

Подключение GD2 к PHP под FreeBSD

PHP уже инсталлирован из портов

Точнее не только PHP, но вообще всё (php, MySQL, Apache, ...) было настроено с помощью портов.

# cd /usr/ports/lang/php4-extensions
# make config                   добавляем галочку: "GD library support"
# make deinstall
# make reinstall
# apachectl -k graceful         мягкий перезапуск
или
# apachectl restart             грубый перезапуск

PHP собран вручную

В этом случае требуется предварительная работа по подготовке JPEG и ZLIB

Установка поддержки JPEG

Возможны варианты

JPEG из порта
# cd /usr/ports/graphics/jpeg
# make
  получили директорию     work/jpeg-6b
  не делать make install
JPEG из дистрибутива
# cd /usr/dist/
# wget ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
# gunzip -c jpegsrc.v6b.tar.gz | tar xf -
# cd /usr/dist/jpeg-6b
# ./configure
# make

Надо установить поддержку zlib

Из порта
# cd /usr/ports/archivers/php4-zlib
# make
  Libraries have been installed in:
   /usr/ports/archivers/php4-zlib/work/php-4.4.4/ext/zlib/modules

Собираем PHP

# cd /usr/dist/php-4.4.4
# ./configure
  --with-mysql
  --with-apache=/usr/dist/apache_1.3.37
  --enable-memory-limit
  --with-gd
	   без указания директории инсталлируется встроенная в PHP библиотека GD.
  --with-jpeg-dir=/usr/ports/graphics/jpeg/work/jpeg-6b   , если jpeg из порта
			  или /usr/dist/jpeg-6b                       , если jpeg из дистрибутива
  --with-zlib-dir=/usr/ports/archivers/php4-zlib/work/php-4.4.4/ext/zlib/modules
# make install && make clean

Далее собираем новый Apache как обычно и заменяем им старый. JPEG, PNG, GIF работают.

Тестирование

gif.php:
<?php
 function_exists("imagegif") or exit();
 header("Content-type: image/gif");
 $im = ImageCreateTrueColor( 200, 100 );
 $text_color = ImageColorAllocate( $im, 233, 14, 91 );
 ImageString( $im, 1, 5, 5, "A Simple GIF Text String!", $text_color );
 ImageGif($im);
 ImageDestroy($im);
?>

png.php
<?php
 function_exists("imagepng") or exit();
 header("Content-type: image/png");
 $im = ImageCreateTrueColor( 200, 100 );
 $text_color = ImageColorAllocate( $im, 233, 14, 91 );
 ImageString( $im, 1, 5, 5, "A Simple PNG Text String!", $text_color );
 ImagePng($im);
 ImageDestroy($im);
?>

jpg.php:
<?php
 function_exists("imagejpeg") or exit();
 header("Content-type: image/jpeg");
 $im = ImageCreateTrueColor( 200, 100 );
 $text_color = ImageColorAllocate( $im, 233, 14, 91 );
 ImageString( $im, 1, 5, 5, "A Simple JPEG Text String!", $text_color );
 ImageJpeg($im);
 ImageDestroy($im);
?>

gd_info.php:
<TABLE BORDER=1><TR><TH>KEY<TH>VAL
<?php
 $temp = gd_info();
 foreach( $temp AS $key=>$val ) echo "<TR><TD>$key<TD>$val";
?>
</TABLE>
<BR><BR><BR>
<img src=./gif.php>
<img src=./png.php>
<img src=./jpg.php>

Пройденные ошибки

При установке библиотеки JPEG после "make" была сделана команда "make install" с расчётом, что новые файлы лягут в /usr/local и потом автоматически будут там найдены

# ./configure
  --with-mysql
  --with-apache=/usr/dist/apache_1.3.37
  --enable-memory-limit
  --with-gd
  --with-jpeg-dir
  --with-zlib-dir=/usr/ports/archivers/php4-zlib/work/php-4.4.4/ext/zlib/modules

Но почему-то JPEG не подключился. Не было никакой отрицательной диагностики и нет результата.


По глупости я тыкался как слепой котёнок пытаясь поставить то так, то этак. То через всё встроенное, то через скаченное, то из портов. Всё это безобразие сопровождалось лишними инсталляциями от чего произошли накладки из-за которых в момент инсталляции PHP были ошибки:

# ./configure
 --with-mysql
 --with-apache=/usr/dist/apache_1.3.37
 --enable-memory-limit
 --with-gd=/usr/local
Thank you for using PHP.
# make install
/usr/dist/php-4.4.4/ext/gd/gd.c:1151: undefined reference to `gdImageRotate'
при этом вроде директория для GD указывается, но диагностика ссылается на встроенную директорию.
# ./configure
 --with-mysql
 --with-apache=/usr/dist/apache_1.3.37
 --enable-memory-limit
 --with-gd=/usr/local
 --with-jpeg-dir=/usr/local
 --with-png-dir=/usr/local
 --with-zlib-dir=/usr/ports/archivers/php4-zlib/work/php-4.4.4/ext/zlib/modules
Thank you for using PHP.
# make install
...
/usr/dist/php-4.4.4/ext/gd/gd.c:837: undefined reference to `gdImageColorMatch'
/usr/dist/php-4.4.4/ext/gd/gd.c:1151: undefined reference to `gdImageRotate'
*** Error code 1

Попытка подготовить все модули отдельно и точно указать на них:

# ./configure
 --with-mysql
 --with-apache=/usr/dist/apache_1.3.37
 --enable-memory-limit
 --with-gd=/usr/ports/graphics/gd/work/gd-2.0.33
 --with-jpeg-dir=/usr/dist/php-4.4.4/0/bin
 --with-zlib-dir=/usr/ports/archivers/php4-zlib/work/php-4.4.4/ext/zlib/modules
ext/gd/gd.o: In function `zif_imagecolormatch':
/usr/dist/php-4.4.4/ext/gd/gd.c:837: undefined reference to `gdImageColorMatch'
ext/gd/gd.o: In function `zif_imagerotate':
/usr/dist/php-4.4.4/ext/gd/gd.c:1151: undefined reference to `gdImageRotate'
ext/gd/gd.o: In function `zif_imageline':
/usr/dist/php-4.4.4/ext/gd/gd.c:2229: undefined reference to `gdImageAALine'
ext/gd/gd.o: In function `zif_imageellipse':
/usr/dist/php-4.4.4/ext/gd/gd.c:2372: undefined reference to `gdImageEllipse'
ext/gd/gd.o: In function `zif_imageantialias':
/usr/dist/php-4.4.4/ext/gd/gd.c:3906: undefined reference to `gdImageAntialias'
*** Error code 1

Решение

После того, как были удалены все следы инсталляций GD, а потом всё сделано как написано вначале - всё получилось.

Ссылки по теме