Как узнать размер файла при imagejpeg() ?

Artemiy117

Новичок
Бьюсь над проблемой. Помогите решить:

Есть скрипт который выводит картинки через imagejpeg();
Нужно в заголовке отдать Content-Length.
Но до вывода картинки он мне неизвестен. Как узнать размер в байтах?

Например:
PHP:
$image=imagecreatefromjpeg("имя_файла");
...
подрезаем,уменьшаем, накладываем ватермарк
...
header("Content-Length: ".filesize("имя_файла"));
header("Content-Type: image/jpeg");
imagejpeg($image);
imagedestroy($image);
exit;
В итоге не выходе мы получаем другой размер, нежели в оригинале. Так как GD перестраивает картинку.
Как узнать какой будет размер у будущей картинки? Может как-то через буфер высчитать типа ob_start, ob_end_flush. С ним я не догнал как работать, и вообще возможно ли данное решение через буфер?
Можно конечно сохранить в файл и посчитать на диске размер, но лишний раз сохранять/удалять не хочется.
 

Artemiy117

Новичок
Можно конечно опустить размер картинки, но собственно из-за чего я столкнулся с такой проблемой:
В настройках веб-сервера Kepp Alive установлен в 5 секунд. А браузеры некоторые (IE например) дословно: "сам закрывает keep-alive соединение примерно через 60 секунд". Тогда как другие браузеры понимают "Поле “Keep-Alive: timeout=время” заголовка".
В итоге что получается: В ИЕ картинка грузится ровно столько, сколько стоит параметр Keep Alive на сервере. Так как ему посылается неверный размер (больше, чем сама картинка при imagejpeg() ). И браузер думает, что картинка еще не догрузилась, и ждет.
Если выставить Keep Alive в 1 или 0 - это чревато выводом 500-й ошибки сервера.
Как правильно сделать? Заморочиться с подсчетом правильного размера или пойти каким другим путем?
 

Фанат

oncle terrible
Команда форума
правильно. не надо сохранять "лишний раз"
надо просто сохранить один раз, и дальше обращаться к этой картинке обычным образом.
 

Artemiy117

Новичок
Хорошо, а как из сохраненного файла взять и вывести её, не изменяя. Вместо imagejpeg написать echo с соотв. заголовками?
У меня кеш этих картинок есть на диске, но перед каждым разом надо проверить не поменялся ли оригинал. И если нет, то вывести как раз из этого файла. А напрямую обратиться к картинке тут уже не получится. Только через скрипт с проверкой. И тогда там как, через обычную
echo file_get_content("имя_файла")
?
 

Фанат

oncle terrible
Команда форума
если оригинал меняется, то все вариации тоже должны быть перегенерированы.

я так понимаю, что речь идёт о сайте с мизерной посещаемостью? не стоит думать, что посещаемость сохранится на том же уровне. когда-нибудь она вырастет.
 

Artemiy117

Новичок
Так я его меняю и пересохраняю. Но обычно когда все тихо и спокойно беру из кеша.
Как тогда, через echo с соотв. заголовками?
 

Фанат

oncle terrible
Команда форума
какого ещё кэша?
не нужен никакой кэш.
файлы спокойно лежат себе на диске и отдаются веб-сервером.
не лезь к ним своими скриптами вообще.
 

Artemiy117

Новичок
это из серии зачем мне вообще вода на вопрос "где можно напиться?".
Собственно, проблема решена методом выше. Только веб-сервер мне не скажет когда изменится исходник картинки. Поэтому по-любому надо проверку делать. И при необходимости создавать миниатюру на диске. Это я и называю кэш.
 

Фанат

oncle terrible
Команда форума
это из серии "зачем тебе керосин?" на вопрос "где можно напиться?"
Миниатюру надо создавать не при необходимости, а в момент изменения оригинала.

Для хомяка без посетителей твой подход будет работать. но если посещаемость вырастет, то все равно придётся переделывать нормально. Тогда тебе пригодится мой ответ, что пьют не керосин а воду.
Удачи.
 
Сверху