Задача- в каталоге у элементов есть большие картинки, нужно выводить несколько их превьюшек разного размера(для каждого элемента по три штуки). Обойти весь каталог скриптом и на генерировать маленькие картинки не вариант(по политическим причинам).
Решение - resize на лету.
Проблемы - нагрузка на железо.
Как выкручивался:
В качестве точки старта выбрал готовую функцию CIBlock::ResizePicture(). Создал скрипт resize.php который будет возвращать браузеру уменьшенную картинку:
i - id картинки в b_file h - высота w - ширина
В этот скрипт помещаем нашу функцию, вокруг которой и будут происходить танцы с бубном. Перво-наперво, на всякий случай выключим всё не нужное - define("SM_SAFE_MODE", true) и очистим вывод $APPLICATION->RestartBuffer(). Для каждого типа изображения добавляем хедер - header("Content-type: image/jpeg") - для каждого свой! Теперь уменьшим нагрузку (только если есть frontend) -
header("Pragma: public");//может кэшироваться всеми (прокси-серверами тоже)
header("Cache-Control: max-age=100000000");//закэшируем на сто тысяч мильонов лет
Нюансы: злоумышленники перебирая параметры i и h и w могут заполнить кэш проксирующего сервера, да и вообще сделать не нужную нагрузку на сервер. Решение проблемы - кодировать передаваемые параметры (двустороннее кодирование!):
- ещё хорошо бы ограничить максимальные значения h и w.
пример можно взять здесь, а красиво посмотреть здесь
PHP - вы что? А если 100 картинок на странице? Тогда у вас будет не 1 хит при запросе, а 101 и серверу просто кранты (количество коннектов апача хотя бы переполнится).
ИМХО, генерировать картинки на лету, можно исключительно ради баловства. На рабочем проекте этого быть не должно. При запросе мелкой картинки с сервера допустима только проверка на её существование. Если нет - создаём и кидаем например в папку temp_pic, которую вы по своим "политическим" причинам можете иногда целиком удалять.
P.S. В скрипте нет проверки на максимум, т.е. если я укажу resize.php?i=7840&h=12000000000000000000&w=400 серверу может поплохеть.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».