PHP

Изображения на странице сжирают всю память и "кладут" сервер.

Привет всем, с Новым годом!

Есть на сайте страница, на которой 95% контента состоит из изображений, которые хранятся в каталоге на сайте, идет самый стандартный вывод картинок через , но как только появилась эта страница, часто стала выходить 502 страница. Проверил access_log, там все в обращениях к картинкам, за 1 секунду происходит столько запросов, сколько на странице. По 20-30 за 1 секунду. Выросло втрое потребление оперативной памяти.

И вот вопрос, а как же сайты где и по 200 картинок на странице у людей и более, разные витрины к примеру с изображениями товаров. В чем соль вообще, как с этим бороться.

Необходимо добиться того, что бы все картинки показывались но не было такой дикой нагрузки на сервер при этом. 1 пользователь создает 20-30 запросов за 1 секунду.

К примеру из лога: ip. - -[29/Dec/2018:04:39:23 +0300] "GET /картинка. png HTTP/1.0" 200 13361 "адрес страницы с картинкой" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36

И таких записей за 9/Dec/2018:04:39:23 30 штук (сколько картинок на странице). Это от одного человека. Будет 2 просматривать будет 60 записей, а будет смотреть 60 человек, так вообще боюсь представить.

Как исправить это?
Да уменя есть сайт который состоит из одних картинок сейчас 50 картинок на страницу делал и 200 и 500 причём они ещё и скриптом модифицируются! Проблем не было но я их предусмотрел в заголовки добавил кеширование на стороне клиента  до 2118 года :)  и ещё буфер на сервере тоесть та картинка которая уже подвергалась обработке помещаться в отдельную папку и потом при запросе
проверяется толи взять и обработать картинку то ли взять готовый вариант уже ранние обработанный работает всё как часы! Да картинки высокого качества весят прилично. Браузеры без труда справляются с загрузкой до 1000 картинок тут уже всё зависит от сервера и скорости интернет чтоб они не начали грузится одновременно можно написать простой скрипт на JS который будет после загрузки первой картинки инициировать загрузку второй и тд

Роман Петличенко
Роман Петличенко
71 773
Лучший ответ
У тебя там апач? Если да, используй для картинок nginx или залей картинки куда-нибудь наружу. Хоть вон в github pages.
1. В яндекс "использование nginx для раздачи статического контента"
2. 200 картинок... И что? Действительно, когда основной сервер напрягать раздачей картинок нецелесообразно - они могут кэшироваться другими. С картинками это просто. Например, ядро создает ссылки images.mysite.com/[xxx].jpg - сервер смотрит - есть у него этот файл - отдает, нет запросит у основного один раз. Ну и параллелить легко - images1, images2 ...все с одинаковым поведением. И обновлять просто. Важно, чтобы у картинок был уникальный id. Потом накрутка логики с удалением - можно даже не беспокоиться, не было запросов месяц - удаляем, если понадобиться - картинка снова будет взята с мастера. Потом защита, чтобы другие ваши картинки у себя не использовали. И т. д.
Кирилл Задорожный я хостюсь на nic.ru заказывать отдельный сервер под картинки предлагаете? Мне кажется это не целесообразным решением. Или я что то не так понял?
Вопрос состоит лишь в том, почему за одну загрузку страницы каждая картинка отображается отдельным запросом. Как буд-то бы пользователь обновил страницу 30 раз за секунду. Вот в этом, как мне кажется проблема. Мне кажется такого не должно быть.
Так там уменьшенные картинки на товарах и загрузка происходит постепенно, там же есть разбитие на страницы, а не по 100500 товаров на 1 странице.
Кирилл Задорожный Это понятно, ну все равно не кажется ли это странным что к каждой картинке идет отдельный запрос. даже разбить страницу по 20-30 картинок, что это даст. если один пользователь на такой странице будет давать 20-30 запросов в секунду. Это не нормально же.
Я уверен дело не в самих картинках, очевидно что существует баг в одном из циклов скрипта. для начала попробуй исключить, или заменить изображение на котором начинается баг, если не поможет копай циклы
Кирилл Задорожный Так бага то по сути и нет. Просто мне не нравится что лог файл весь изгадился запросами к картинкам. И как мне показалось именно из-за такого кол-ва запросов нагрузился и сервер от чего выпала 502 ошибка. Цикл самый простой, ничего необычного. На количество повторений равное количеству файлов в каталоге. Меняется только имя файла в нутри цикла и все.