отделение тега изображения от изменения размера изображения

В настоящее время у меня есть функция в PHP под названием img(), которая принимает как минимум два аргумента:

print img("foo.jpg", 100);

Это вернет что-то вроде этого:

<img src='/cache/foo_XXXXX.jpg' width='100' height='76' />

Итак, функция принимает аргументы, изменяет размер исходного файла и сохраняет его как кешированный файл на сервере и возвращает тег изображения. Очевидно, что если кешированная версия уже существует, он просто возвращает ее и сохраняет обработку для следующего раза.

Теперь это отлично работает в 99 случаях из 100, но для некоторых сайтов есть страницы, которые довольно загружены изображениями, и, поскольку срок действия кэшированных версий изображения истекает через X дней, функциям img() необходимо воссоздать 50+ изображений высокого разрешения в маленькие миниатюры, а загрузка такой страницы занимает несколько секунд, а это неприемлемо.

Поэтому моя идея состоит в том, чтобы отделить это. Итак, делаем это:

print img("foo.jpg", 100);

вернет это:

<img src='img.php?ARGUMENTS' width='?' height='?' />

Это означает, что функция img() на самом деле вообще не обрабатывает файл, а выводит HTML, который сообщает браузеру, что нужно получить изображение из скрипта PHP, а не из файла статического изображения на сервере.

Теперь часть «ARGUMENT», конечно же, будет содержать всю информацию, которая необходима img.php для работы с файлом так же, как img() — возможно, сериализованную строковую версию всех аргументов функции?

Но проблема в значениях ширины/высоты тега изображения! Поскольку обработка вынесена за рамки текущего скрипта, он понятия не имеет, насколько большим будет результирующее изображение, верно? Я, очевидно, не могу дождаться завершения img.php и вернуть его. Я использую imagemagick для обработки (поэтому второй аргумент может быть 100, «50%», «‹40» и еще много чего), и, возможно, есть способ «пробного запуска» его с помощью imagemagick, т. е. чтобы imagemagick возвращал результирующий размер определенный файл с помощью определенной команды?

Как бы вы решили это?


person Sandman    schedule 12.12.2012    source источник


Ответы (1)


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

person Ranty    schedule 12.12.2012
comment
Нет, изображения — это просто файлы на жестком диске сервера. По крайней мере, что касается тега img(). В некоторых случаях ссылка на файл хранится в базе данных, но мы говорим о множестве разных баз данных для разных целей, и все они используют img() для отображения. - person Sandman; 12.12.2012