1С-Битрикс: Управление сайтомНа главную страницу
Клиентам
Маркетплейс
Партнерам
Разработчикам
Интеграция с 1С
Идея?


Личный кабинет
Авторизоваться
Регистрация
(войти) Корзина
Логин:

Пароль:



Забыли свой пароль?
Регистрация
Войти как пользователь:
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
ВКонтакте
Мой Мир
Twitter
Facebook
Google
Livejournal
Яндекс
Rambler
Mail.Ru
Liveinternet
Blogger
OpenID
Используйте вашу учетную запись VKontakte.ru для входа на сайт.
Используйте вашу учетную запись Мой Мир@Mail.ru для входа на сайт.
Используйте вашу учетную запись на Twitter.com для входа на сайт.
Используйте вашу учетную запись на Facebook.com для входа на сайт.
Используйте вашу учетную запись Google для входа на сайт.
.livejournal.com
@yandex.ru
@rambler.ru
@mail.ru
http://www.liveinternet.ru/users/ /
.blogspot.com
OpenID:
  • Документация
    • Платформа PHP
    • Корпоративный портал
    • Платформа ASP.NET
    • Отраслевые решения
    • Marketplace
    • Аренда приложений (SaaS)
  • Обучение и сертификация
    • Онлайн-курсы и сертификация
    • Учебные центры
    • Мое обучение
    • Учебные видеоролики
  • Центр поддержки
    • Поддержка
    • FAQ
    • Мои обращения
  • Сообщество
    • Блоги Битрикс
    • Блоги веб-разработчиков
    • Общие форумы
    • Веб-разработчики
      • Моя страница
      • Мои сообщения
      • Группы
      • Найти коллег
  • Cтатьи
    • Архив
Главная / Общение / Сообщество разработчиков / Емельянов Алексей / Блог

Ресайз картинок на лету

Профиль
Друзья
Группы
Форум
Блог
Микроблог

Емельянов Алексей

Дата последнего входа: 04.02.2012 19:12:30
Наименование компании: LEBRAND Creative Russia

Ресайз картинок на лету

1
Емельянов Алексей
16.03.201014:5016.03.2010 14:50:27
Задача - в каталоге у элементов есть большие картинки, нужно выводить несколько их превьюшек разного размера(для каждого элемента по три штуки). Обойти весь каталог скриптом и на генерировать маленькие картинки не вариант(по политическим причинам).

Решение - 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.


пример можно взять здесь, а красиво посмотреть здесь
Емельянов Алексей
16.03.201014:5016.03.2010 14:50:27
Просмотров:3170 Комментариев:10 1
1
Max Pryazhevsky
16.03.2010 16:34:56
А CFile::ResizeImageGet() не пробовали?
Ссылка 1
0
Емельянов Алексей
16.03.2010 17:14:24
Спасибо за наводку, меня смущает только не превратится ли resize_cache в мусорку, не актуальные превьюшки нужно будет как то удалять.
Родитель Ссылка 0
0
Иван Левый
16.03.2010 18:27:28
Превьюшки удаляются из этой папки, если удалить сам элемент. Тем эта фукнция и хороша.
Родитель Ссылка 0
0
Долганин Антон
16.03.2010 19:20:16
PHP - вы что? А если 100 картинок на странице? Тогда у вас будет не 1 хит при запросе, а 101 и серверу просто кранты (количество коннектов апача хотя бы переполнится).

Чему детей учите? smile:)
Ссылка 0
0
User 2000
16.03.2010 20:09:19
Речь о том, что картинки будут кешироваться.
Родитель Ссылка 0
0
Емельянов Алексей
16.03.2010 20:10:32
100 картинок нормально пережёвываются, к тому же они потом сохранятся в кэше nginx'а, и последующие запросы до апача не будут доходить.

p.s. извините конечно за пошлость, но это как раз тот случай, когда сначало больно, а потом нормально (когда кэш наполнится)
Родитель Ссылка 0
0
Петров Роман
17.03.2010 05:59:15
мы делаем по-другому:
/pic/80/366346.jpg
80 - это ширина картинки
можно сделать еще и так /pic/80/60/366346.jpg
где 80х60 - то, что должно получиться

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

Ссылка 0
0
Паносян Артём
20.03.2010 17:27:34
ИМХО, генерировать картинки на лету, можно исключительно ради баловства. На рабочем проекте этого быть не должно. При запросе мелкой картинки с сервера допустима только проверка на её существование. Если нет - создаём и кидаем например в папку temp_pic, которую вы по своим "политическим" причинам можете иногда целиком удалять.

P.S. В скрипте нет проверки на максимум, т.е. если я укажу resize.php?i=7840&h=12000000000000000000&w=400 серверу может поплохеть.
Ссылка 0
0
Емельянов Алексей
20.03.2010 22:00:23
прочитай до конца..., а скрипт не боевой и выложил для примера
Родитель Ссылка 0
1
Роман Забродин
22.03.2010 07:53:38
Есть большой минус с точки зрения безопасности -- можно легко переполнить диск нагененировав скриптом картинок.
Ссылка 1

Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».
 
Технологии Эрмитаж
BitrixMobile
Автокеширование
SiteUpdate
Производительность Виртуальная машина
Веб-окружение
Результаты тестов
Выбрать хостинг
Веб-кластер
Безопасность Проактивная защита
Веб-антивирус
Аутентификация

Контакты Поиск Карта сайта
Телефон: +7 (495) 229-14-41
Оставайтесь с нами: Facebook Twitter Habrahabr VKontakte Developers Google 1+
Как распознать QR код?Контакты QR


© 2001-2012 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом.
Английская версия Немецкая версия