Изменение размера картинок на лету с кешированием

Тема в разделе "PHP", создана пользователем Mapkyc, 10 авг 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Mapkyc

    Mapkyc Постоялец

    Регистр.:
    8 май 2007
    Сообщения:
    106
    Симпатии:
    45
    На сайте в разных местах необходимо выводить разные размеры одной картинки.

    Сейчас это решается установкой width="" в качестве параметра тега.

    Хотелось бы иметь такой php скрипт, которому давали параметром имя оригинала и размеры, а он проверял, если есть кеш, то отдавал бы его, если не было уменьшал бы картинку, кешировал в файл, и отдавал браузеру.
     
  2. McLay

    McLay Постоялец

    Регистр.:
    20 май 2008
    Сообщения:
    71
    Симпатии:
    15
    а в чем вопрос? GD в помощь. И еще полезено будет озаботиться кешированием на уровне браузера.
     
  3. Mapkyc

    Mapkyc Постоялец

    Регистр.:
    8 май 2007
    Сообщения:
    106
    Симпатии:
    45
    Спасибо конечно=) Я наверно невнятно высказался выше. :D

    Кеширование на уровне браузера не интересно.
    Дело в том что мой сайт посещают около двух тысяч человеков в день. Мой хостер и так порой жалуется, что много ресурсов кушаю. Приходится постоянно повышать тариф. Ресайз картинок занимает немало процессорного времени, особенно когда их на странице много - это новостной портал.

    Нужен скрипт такого типа
    Обращаемся resize.php?img=uploads/image.jpg&w=300
    Скрипт проверяет есть ли уже в директории с кешем(ну скажем в директории imgcache уменьшенная версия такой картинки, в идеале, смотрит дату создания, не превышает ли она установленный в скрипте параметром кеш-лимит) если есть - отдает из кеша - нет генерит умешьшенную копию и сохраняет в кеш
     
  4. Digwnews

    Digwnews Читатель

    Заблокирован
    Регистр.:
    1 мар 2010
    Сообщения:
    127
    Симпатии:
    24
    Вот функция ресайза:
    PHP:
    function imageresize(&$img$width$height) {
        
    $w imagesx($img);
        
    $h imagesy($img);
        
    $ratio 0;
        if(
    $width && $height) {
            
    $w_dest $width;
            
    $h_dest $height;
        } else {
            if(
    $width 0)
                
    $ratio $w $width;
            elseif(
    $height 0)
                
    $ratio $h $height;
            if(
    $ratio 0) {
                
    $w_dest round($w $ratio);
                
    $h_dest round($h $ratio);
            }
        }
        if(!
    $w_dest || !$h_dest)
            return 
    false;
        
    $new_img imagecreatetruecolor($w_dest$h_dest);
        
    imagealphablending($new_imgfalse);
        
    imagesavealpha($new_imgtrue);
        
    imagefilledrectangle($new_img00$w_dest$h_destimagecolorallocatealpha($new_img255255255127));
        
    imagecopyresampled($new_img$img0000$w_dest$h_dest$w$h); 
         
    $img $new_img;
    }
    А в чём проблема кэширования? Просто сканируете папку scandir() и смотрите - есть или нет изображения - если есть - отдаёте, если нет - ресайз+сохранение.

    А вообще атрибут width был наверно более правильным решением.

    $img - это ваш созданный в php имг.
    $width - нужная ширина
    $height - высота
    Из ширины или высоты нужно указывать что-то одно. Функция пропорционально уменьшит изображение.
     
  5. McLay

    McLay Постоялец

    Регистр.:
    20 май 2008
    Сообщения:
    71
    Симпатии:
    15
    аа. то есть уже готовый скрипт нужен?) понял.

    насчет кеширования на уровне браузера. Обычные картинки кешируются без особого труда, а вот через php запрос кеширование может не работать, поэтому желательно доработать, чтоб опять же меньше платить хостеру)
     
  6. Digwnews

    Digwnews Читатель

    Заблокирован
    Регистр.:
    1 мар 2010
    Сообщения:
    127
    Симпатии:
    24
    Какая разница запрос или нет?
    Как я понял кеширование в данном случае - это просто сохранение изменённого изображения.
     
  7. Mapkyc

    Mapkyc Постоялец

    Регистр.:
    8 май 2007
    Сообщения:
    106
    Симпатии:
    45
    Сейчас я думаю решать задачу так, возьму скрипт уменьшения картинки с сохранением в файл. буду сохранять в директорию, откуда на сайте будет запрашиваться картинка, под с помощью mod_rewrite создам правило, что если файл в директории отсутствует - переписывать урл на скрипт, передавая ему определенные параметры.

    Но это не то решение, какое хотелось бы. Хотелось бы так как я написал во втором посте.

    McLay, я конечно извиняюсь, но не тупи!
    Причем тут кеширование в браузере. Речь идет о кешировании на сервере уменьшенной копии, дабы скрипт ее заново не генерил.
     
  8. McLay

    McLay Постоялец

    Регистр.:
    20 май 2008
    Сообщения:
    71
    Симпатии:
    15
    кеширование в браузере в дополнение к серверному

    Добавлено через 2 минуты
    большая. Как правило серверы настроены так, что в заголовках просят кешировать все каринки, но не php скрипты
     
  9. Digwnews

    Digwnews Читатель

    Заблокирован
    Регистр.:
    1 мар 2010
    Сообщения:
    127
    Симпатии:
    24
    Вот зачем вам мод_реврайт??
    В функции, которую я привёл - есть всё, что вам нужно, кроме кеширование.
    А уж записать в файл и делать проверку, я думаю, вы сами сможете.

    Добавлено через 3 минуты
    McLay, вы просто не поняли, что нужно сделать.
     
  10. McLay

    McLay Постоялец

    Регистр.:
    20 май 2008
    Сообщения:
    71
    Симпатии:
    15
    прекрасно понял. я же говорю в дополнение.
    кстати мод_реврайт замечательно решение. Потому как, иначе придется постоянно дергать пхп скрипт и передавать через него килобайты картинок, что тоже не очень хорошо скажется на ресурсах)
     
Статус темы:
Закрыта.