среда, 25 августа 2010 г.

Проблемы с GD: не отображаются динамические картинки

Седня столкнулся с проблемой: на сайте не фурычат юзербары - это такие узенькие картинки, которые вставляют в подпись на форумах и на которых отображается всякая данамическая инфа, к примеру количество скачанной/отданной информации на торренте и т. п.

Итак, сразу скажу, не кодер я. Ошибки php-скриптов отлавливать не обучен, да и не было таких задач. Но сегодня пришлось самому въезжать в эти тонкости.


У моих знакомых был портал на одном хостинге, юзербары отображались. Потом перенесли ко мне на VPS свой портал и исчезли эти самые юзербары.

Так, думаю, надо посмотреть переменные php.ini. Как? Окей, лезу в гугл, читаю что нужно создать файлик произвольного названия с расширением php и запустить на вебсерваке. Впрочем об этом я писал уже тут.
Смотрю секцию про GD (это такая библиотека для работы с изображениями, есть еще менее популярный, но более функциональный Imagick)

gd

GD Support enabled
GD Version 2.0
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.4.0
T1Lib Support enabled
GIF Read Support enabled
GIF Create Support enabled
JPEG Support enabled
libJPEG Version 6b
PNG Support enabled
libPNG Version 1.2.44
WBMP Support enabled


DirectiveLocal ValueMaster Value
gd.jpeg_ignore_warning00

Смотрю,вроде бы всё как и должно быть. На всякий случай проверяю что в системе установлена библиотека libpng.

Так, теперь нужно как то протестировать скрипт. Рабочий скрипт ого-го какой, без спеца не разобраться, поэтому иду на офф сайт php и модифицирую готовый экзампл до следующего вида:

<?php
header("Content-type: image/png");
$string = $_GET['text'];
$im     = imagecreatefrompng("test_png.png");
$orange = imagecolorallocate($im, 220, 210, 60);
$px     = (imagesx($im) - 7.5 * strlen($string)) / 2;
imagestring($im, 3, $px, 9, $string, $orange);
imagepng($im);
imagedestroy($im);
?>

Обзываю этот файл test_png.php и кидаю вместе с первой попавшейся картинкой (обозвал test_png.png) на вебсервак.
Такс, теперь нужно включить отладочную информацию, чтобы в случае чего я в браузере увидел бы ошибки php. Лезу в гугл. Наиболее правильный способ это сделать, это добавить следующие две строчки в файл .htaccess:

php_value display_errors 1
php_value error_reporting 2047

Пару слов про уровень репортинга ошибок:
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT

•   E_ALL              - Все предупреждения и ошибки.
•   E_ERROR            - Критические ошибки времени выполнения.
•   E_WARNING          - Предупреждения времени выполнения.
•   E_PARSE            - Ошибки трансляции.
•   E_NOTICE           - Замечания времени выполнения (это такие
                предупреждения, которые, скорее всего,
                свидетельствуют о логических ошибках в
                сценарии, - например, использовании
                неинициализированной переменной).
•   E_CORE_ERROR       - Критические ошибки в момент старта PHP.
•   E_CORE_WARNING     - Некритические предупреждения во время старта PHP.
•   E_COMPILE_ERROR    - Критические ошибки времени трансляции.
•   E_COMPILE_WARNING  - Предупреждения времени трансляции.
•   E_USER_ERROR       - Сгенерированные пользователем ошибки.
•   E_USER_WARNING     - Сгенерированные пользователем предупреждения.
•   E_USER_NOTICE      - Сгенерированные пользователем замечания.

Запускаю свой тестовый скрипт как написано в мануале http://IP_or_DNS/test_png.php?text=test. Это значит что на картинке должно появится слово "test". Вместо картинки вполне ожидаемо получаю вожделенную ошибку:

Fatal error: Call to undefined function imagecreatefrompng()

Гуглю, оказывается что нужно установить пакет php5-gd и перезагрузить вебсервер. Этот пакет у меня не установлен. Ставлю его и картинки начинают отображаться. Это победа!

apt-get -y install php5-gd
 
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  libt1-5
The following NEW packages will be installed:
  libt1-5 php5-gd
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 38.9kB/208kB of archives.
After this operation, 565kB of additional disk space will be used.
Get:1 http://ftp.de.debian.org unstable/main php5-gd 5.3.2-2 [38.9kB]
Fetched 38.9kB in 0s (210kB/s)
Selecting previously deselected package libt1-5.
(Reading database ... 59523 files and directories currently installed.)
Unpacking libt1-5 (from .../libt1-5_5.1.2-3_amd64.deb) ...
Selecting previously deselected package php5-gd.
Unpacking php5-gd (from .../php5-gd_5.3.2-2_amd64.deb) ...
Processing triggers for libapache2-mod-php5 ...
Reloading web server config: apache2.
Setting up libt1-5 (5.1.2-3) ...
Setting up php5-gd (5.3.2-2) ...
Installing new version of config file /etc/php5/conf.d/gd.ini ...

Помятуя о конфузе с GD, ставлю еще и php5-imagick на будущее.

apt-get -y install php5-imagick

Reading package lists...
Building dependency tree...
Reading state information...
The following NEW packages will be installed:
  php5-imagick
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 125kB of archives.
After this operation, 516kB of additional disk space will be used.
Get:1 http://ftp.de.debian.org unstable/main php5-imagick 3.0.0~rc1-1 [125kB]
Fetched 125kB in 0s (524kB/s)
Selecting previously deselected package php5-imagick.
(Reading database ... 59537 files and directories currently installed.)
Unpacking php5-imagick (from .../php5-imagick_3.0.0~rc1-1_amd64.deb) ...
Setting up php5-imagick (3.0.0~rc1-1) ...
Replacing config file /etc/php5/conf.d/imagick.ini with new version

1 комментарий:

Евгений Медведев комментирует...

После переезда перестали воркать юзербары.
Фикс:
проверить что установлен и в apache2 включен mod_php5:

apt-get install -y libapache2-mod-php5