Оптимизация загрузки изображений по url

Столкнулся со следующей проблемой, хотелось бы послушать как это реализовано в схожих проектах:

Имеется некий сайт объявлений, который по крону загружает XML с объявлениями, которые в т.ч. содержат ссылки на картинки. Эти картинки нужно отобразить в определенных форматах на своём сайте.

Соответственно сейчас я реализовал работу с картинками следующим образом — они загружаются с помощью copy в цикле, а потом прогревается кеш с превьюшками. Но на загрузку 1 картинки уходит около 0.7 секунд, что при большом кол-ве запросов не очень хорошо отражается на времени выполнения скрипта. В масщтабах объявлений получается где-то 7 минут на 100 записей, что есть весьма много.
Как наиболее эффективно оптимизировать процесс?

Пока смотрю в сторону многопоточного curl, но хотел бы узнать какие подводные камни могут у этого решения быть или какие есть альтернативные более эффективные решения?
  • Вопрос задан
  • 4434 просмотра
Решения вопроса 1
AterCattus
@AterCattus
Люблю быстрый backend
Одним потоком через curl_multi_init можно хоть несколько сотен картинок скачивать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Распаралеливание запросов на скачку должно помочь. Подводные камни — смотря какие картинки… В теории могу предположить только что может упасть изза нехватки памяти, хотя не думаю что 5-10 картинок смогут обвалить скрипт. Придется помониторить утечки памяти и т.д.
Ответ написан
Комментировать
@edogs
на загрузку 1 картинки уходит около 0.7 секунд
На что уходят эти 0.7 секунд? Установка соединения, днс резолвинг, скачка, что-то еще?

copy, если это в прямом смысле copy обычное по http — худший вариант. На днс резолвинг, например, в ряде случаев может уходить 0.5 секунды, а он будет происходить каждый раз при copy с хорошей вероятностью.
Делайте curl, все скачки в одной сессии и включайте кэш днс в опциях курла хороший по времени. Уже одно это может на порядок улучшить результат.

php-шный мультикурл вещь пока несовершенная:( Мы бы запускали что-нибудь шелловское через exec, тот же wget например в несколько потоков или что-то мультипоточное изначально.
Ответ написан
Комментировать
KEKSOV
@KEKSOV
Для организации параллельной загрузки и обработки данных я использую pcntl_fork, главное контролируйте число одновременных воркеров, а то систему уложите. И, как сказал выше edogs
Делайте curl, все скачки в одной сессии и включайте кэш днс в опциях курла хороший по времени. Уже одно это может на порядок улучшить результат.
Ответ написан
Комментировать
stnw
@stnw
Например превьюшки необязательно сразу делать. Может они никогда не понадобятся. Я в проекте использовал LiipImagineBundle, который генерирует превью только в непосредственный момент обращения к ней. Или можно просто позже другой командой проходить и генерировать их.
Но тут скорее правильнее подебажить ваш скрипт и понять где именно узкое место находится и его уже оптимизировать.
Ответ написан
copist
@copist
Empower people to give
Ответ написан
Комментировать
Anonym
@Anonym
Программирую немного )
Самое очевидное:
1. Curl'ом загружайте картинки, пока они не загружены, на их местах на сайте показывайте заглушки.
2. Ресайз картинок делайте при отдаче картинки (при первом просмотре), а не при загрузке. Так умеет nginx, ну или можно на php imagemagick дергать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы