проблема с ф-ией imagegif($image);

AHTIXPICT

Новичок
проблема с ф-ией imagegif($image);

Такой простой код:
PHP:
define('IMG_SRC', $_SERVER['DOCUMENT_ROOT']."/tmp/bg.gif");
$image = imagecreatefromgif(IMG_SRC) or die('Cannot create image');
//header('Content-type: image/gif');
imagegif($image);
imagedestroy($image);
При его выполнении пишет:
Warning: imagegif(): Unable to open temporary file in /server/root/tmp/index.php on line 41

php 4.3.11
apache 1.3.33
OC - Linux ASP 9.2
Поискал в гугле нашел что нужно ставить обновление.
Скачал его, распаковал, только вот не совсем понятно мне как его установить,
какие параметры в ./configure указывать, теже что и при установке php или какие то другие
 

AHTIXPICT

Новичок
Tor
У меня с англиским нормально.
Для тебя перевожу:
---- Невозможно открыть временный файл в /server/root/tmp/index.php --------------
Я же говорю с ф-иями
imagejpeg($image)
imagepng($image)
все работает как положено.
Пошел в ГУГЛЬ с этой ошибкой нашел:
http://bugs.php.net/bug.php?id=29594&edit=2
Там написано что все исправлено и заплатку надо установить.
Скачал заплатку, а дальше мой первый пост
 

AHTIXPICT

Новичок
Tor
Слушай, ну причем тут то что версия там пхп другая.
на
http://snaps.php.net/
есть обновление и для 4 версии, я ее именно и скачал
Старайся отвечать в тему или не отвечать вообще
 

Tor

Новичок
AHTIXPICT

баг нашли в CVS версии 5-ки
у тебя 4-ка + руки
и решаешь ты не ту проблему
 

AHTIXPICT

Новичок
Tor
Ты че тормозишь?
Говорю же с другими форматами аналогичный код работает
Ты вообще на код смотрел?
Где там ошибка может быть в трех строках?
Если я не прав укажи в какой из строчек ошибка

-~{}~ 05.05.05 16:51:

То Tor и других
Такой код работает без ошибок:
---------------
PHP:
define('IMG_SRC', $_SERVER['DOCUMENT_ROOT']."/tmp/bg.gif");
$image = imagecreatefromgif(IMG_SRC) or die('Cannot create image');
//header('Content-type: image/gif');
imagegif($image, "/tmp/img.gif");
imagedestroy($image);
------------
Но он сохраняет картинку в файл /tmp/img.gif
А мне нужно вывести ее в браеузер
 

AHTIXPICT

Новичок
fixxxer
гы.
chmod на что?
На /tmp стоит полный доступ
На документ_рут стоит на фолдер rwxr_xr_x(755) и на файлы rw_r__r__(644) владелец root.
Установлено все правильно.
Куда я должен дать права?
 

crocodile2u

http://vbolshov.org.ru
пользователь, от кот. работает веб-сервер, должен иметь права на запись в директорию, где ты создаешь свою картинку.
 

AHTIXPICT

Новичок
crocodile2u
Такое ощущение, что Вы не читаете тему вообще.
Типа вижу последнюю строчку чьего то ответа и пишу что в голову пришло.
----------
Мне не нужно записывать картинку в файл, мне нужно ее отдать броузеру.
Доступ к временной директории у апача есть
 

AHTIXPICT

Новичок
Tor
Как ты считаешь, принцип работы функций:
imagegif()
imagejpeg()
imagepng()

одинаков или нет?

Так вот две из этих ф-ий возвращают ожидаемый результат, а
imagegif() возвращат ошибку описаную выше.
Ты уперся как баран, типа: "я считаю что проблема в руках, и ничего больше", и никуда дальше этого твои посты не идут.
Если хочешь дальше доказывать что у меня руки не оттуда и что прав не хватает, просьба, доказывай это в другом месте, не флуди.
 

Tor

Новичок
Как ты считаешь, принцип работы функций:
imagegif()
imagejpeg()
imagepng()
одинаков или нет?
незнаю, я в код не лазил
это ТЕБЕ надо, так почему бы не посмотреть?

и если последние две работают, то почему бы не использовать их, раз уж у тебя такие проблемы
 

AHTIXPICT

Новичок
Tor
пока нет никаких проблем, тем более что сжатие у imagejpeg()
намного лучше. Просто попался на этом глюке.
Первоначально мой вопрос стоял совсем не так, а как установить апгрейд к пхп, какие параметры указывать в
./cinfigure . Но каак я понял нужно указывать теже параметры что и при установке самого PHP.

PS / и все же мне интересно кто нибудь проверял у себя работу ф-ии imagegif() на PHP 4.3.11
 

specialist

Guest
Автор оригинала: AHTIXPICT
PS / и все же мне интересно кто нибудь проверял у себя работу ф-ии imagegif() на PHP 4.3.11
нормально всё работает....

php 4.3.11
apache 1.3.33
OC - Win2kServer
 

AHTIXPICT

Новичок
На Win32 не проверял к сожалению, больше интересует ОС UNIX и им подобные.
Просто хочу понять , это проблемы в сборке или все же баг в ф-ии как и PHP 5, там точно такакя же ошибка, и они написали что ее уже исправили. А про 4-ку ничего не нашел.
Обновление до 4,3,12 ничего не изменило.
 

valyala

Новичок
Просто хочу понять , это проблемы в сборке или все же баг в ф-ии как и PHP 5, там точно такакя же ошибка, и они написали что ее уже исправили. А про 4-ку ничего не нашел.
Это набор багов в ПХП. Как в четвертой, так и в пятой версии. В файле /ext/gd/gd.c передаются некорректные аргументы в функцию php_open_temporary_file:
Код:
tmp = php_open_temporary_file("", "", &path TSRMLS_CC);
Это ведет к вызову функции php_do_open_temporary_file, находящейся в файле /main/php_open_temporary_file.c. Ей передаются аргуметы со следующими значениями:
path="";
pfx="";

В этой функции есть код, содержащий еще один баг:
Код:
    if (IS_SLASH(path[strlen(path)-1])) {
        trailing_slash = "";
    } else {
        trailing_slash = "/";
    }
Если длина строки path равна нулю (а в нашем случае так и есть), то происходит попытка обращения за границы массива - к байту path[-1]. Тут возможны три случая:
1) core dump
2) этот байт равен символу '/' или '\'. В этом случае ПХП попытается создать временный файл с именем XXXXXX в текущей директории. Вот как образуется это имя:
Код:
    (void)snprintf(opened_path, MAXPATHLEN, "%s%s%sXXXXXX", path, trailing_slash, pfx);
3) байт path[-1] не равен '\' или '/'. Тогда ПХП попытается создать временный файл с именем /XXXXXX, т.е. в корневом каталоге :)

При неудачной попытке создать временный файл в текущей или корневой директории ПХП пытается создать файл XXXXXX в директории с именем, которое возвращает функция php_get_temporary_directory, находящаяся тут же - в файле /main/php_open_temporary_file.c. Под юниксами обычно это функция возвращает значение переменной окуржения с именем TMPDIR.
На /tmp стоит полный доступ
AHTIXPICT, посмотри, что возвращает
PHP:
getenv('TMPDIR')
. Скорее всего, не /tmp.

Ugly bugfixes:
Cпособ 1. Наиболее корректный. Откройте файл /ext/gd/gd.c и замените строчку
Код:
tmp = php_open_temporary_file("", "", &path TSRMLS_CC);
на
Код:
tmp = php_open_temporary_file(NULL, NULL, &path TSRMLS_CC);
Перекомпилируйте ПХП. После этого он не будет обращаться к недопустимому байту path[-1] и не будет пытаться создать временный файл в текущей или корневой директории. Затем измените значение переменной окружения TMPDIR на '/tmp' или установите права на запись для той директории, имя которой находится в TMPDIR.

Способ 2. "Кривой". Установите права на запись в текущую директорию или, внимание, lol, на корневую директорию. Это позволит ПХП создавать временные файлы в указанных директориях.


Баги присутствуют в самых свежих на данный момент версиях файлов /ext/gd/gd.c и /main/php_open_temporary_file.c:
http://cvs.php.net/co.php/php-src/ext/gd/gd.c?r=1.310
http://cvs.php.net/co.php/php-src/main/php_open_temporary_file.c?r=1.32

-~{}~ 06.05.05 18:58:

Задачка для размышления: что будет, если одновременно несколько ПХПшных скриптов попытаются сгенерить картинку?
Вот вам и multiprocess & multithread support :)

-~{}~ 06.05.05 19:35:

Дополнение: задачка для размышления оказалась надуманной. Имя файла генерится с помощью функции mktemp под юникс или GetTempFileName под виндой. Эти функции пытаются сгенерить уникальное имя файла, поэтому с многопоточностью тут все в порядке :)
 

AHTIXPICT

Новичок
В продолжение темы

to tony2001
Пробовал. Видел что в там уже исправлена ошибка о которой говорил valyala, эфект тот же самый, но...

Я проверил так:
echo getenv("TMPDIR");
// получил в ответ
/tmp/.private/root
Смотрим права на этот фолдер и видим 700 + Закрепляющий бит, что впринципе не правильно
Меняю на 777 + Закрепляющий бит
Ф-ия imagegif() делает то что положено.
Теперь возвращаю права на фолдер к исходным и делаю так:
PHP:
putenv("TMPDIR=/tmp");
echo getenv("TMPDIR");
// Возвращает /tmp права на этот фолдер 777 + закр. бит
$image = imagecreatefromgif("bg.gif") or die('Cannot create image');
//header('Content-type: image/gif');
imagegif($image);
imagedestroy($image);
и получаю снова ошибку:
Warning: imagegif(): Unable to open temporary file in /server_root/.../.../tmp/index.php on line 7

Тоесть различия в работе ф-ий: imagegif, imagepng, imagejpeg очевидны.(Две последние ф-ии как работали так и работают)
И я так понимаю ф-ия imagegif() не определяет TMPDIR
Или я всетаки ошибаюсь?

ps/ Это все пробовал на 4.3.11 а так же после обновления к 4.3.12-dev (результат одинаков)
 
Сверху