За последние 24 часа нас посетили 55313 программистов и 1798 роботов. Сейчас ищут 922 программиста ...

Проблема с выводом картинки

Тема в разделе "PHP для новичков", создана пользователем Fess, 14 ноя 2012.

  1. Fess

    Fess Активный пользователь

    С нами с:
    13 июл 2011
    Сообщения:
    21
    Симпатии:
    0
    Добрый день, подскажите, пожалуйста, в чем может быть проблема. Вывожу картинки на экран используя код(Resample.php):

    Код (Text):
    1. $image_p = imagecreatetruecolor($width, $height);
    2. $image = imagecreatefromjpeg($filename);
    3. imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
    4.  
    5. // Output
    6. imagejpeg($image_p, null, 100);
    Этот код вызывается:

    Код (Text):
    1. echo "<div class=\"prod\" style=\"width: $width px\">"
    2.          . "<img src=\"Resample.php?file=$img&y=$max_y\" border=\"0\" class=\"small_prod\" height=$max_y width=$width/>"
    3.       . "</div>\n";
    Раньше вроде все работало и проблем не было, но сейчас у некоторых клиентов не все картинки стали отображаться, причем после каждого F5 выводятся разные, скрин прикладываю ниже.

    [​IMG]
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    поправь меня если что. ты при генерации страницы каждый раз создаешь уменьшенную версию каждой картинки? 50 картинок == 50 ресамплингов. ты блин не очень мудрый человек. надеюсь ты пошутил про клиентов?

    ошибка происходит СКОРЕЕ ВСЕГО от того, что исчерпан time limit (обычно 30 сек).
    азбука: браузер получив html-текст страницы, шлет на сервер запросы на используемые на ней файлы: стили, скрипты, картинки. по умолчанию он пытается одновременно с одного домена качать до 8 файлов или около того (величина настраиваемая). обычно статические файлы хорошо кешируются, но твой скрипт Resample точно НЕ кешируется, всякий раз идет новый запрос. то есть у тебя на сервере на одного чертова посетителя образуется очередь из 8 долгоиграющих процессороёмких запросов. некоторые из них обламываются по таймауту, т.к. этот физический сервер тащит еще 200 долоёбов кроме твоих клиентов. очень вероятно, что клиентов скоро забанит хостинг-провайдер. достаточно 10 раз обновить страницу и капец. критическая нагрузка.

    совет: сохраняй результат ресамплинга в отдельные файлы. функция уменьшения должна срабатывать строго один раз на каждый исходный файл. потом используй готовый результат.
     
  3. Fess

    Fess Активный пользователь

    С нами с:
    13 июл 2011
    Сообщения:
    21
    Симпатии:
    0
    Большое спасибо за ответ
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    тебе рассказать как сохранить результат imagecopyresampled или сам найдешь?
     
  5. Fess

    Fess Активный пользователь

    С нами с:
    13 июл 2011
    Сообщения:
    21
    Симпатии:
    0
    Не откажусь от помощи, заранее спасибо)
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Когда у функции imagejpeg указан параметр filename, она не выводит его в выходной поток как у тебя сейчас, а сохраняет в виде файла.

    Твоя задача завести правило куда должны сохраняться превьюшки, дать права на запись в этот каталог и в скрипте Resample.php сначала проверять "есть ли уже превьюшка для этой картинки?" если нет — создавать превьюшку, затем делать редирект на готовый файл. Если файл уже есть, сразу делать редирект на готовый файл. Apache справляется с отдачей файла очень хорошо, не надо делать это за него в скрипте.
    Код (PHP):
    1. header('Location: адрес_картинки'); die(); 
    Типа того.
     
  7. Fess

    Fess Активный пользователь

    С нами с:
    13 июл 2011
    Сообщения:
    21
    Симпатии:
    0
    так и сделал, спасибо