Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кеширование картинок на сайте

8.8K
26 октября 2006 года
Alximik
95 / / 24.10.2006
Проблема такая. Я считываю фрагмент хтмл-кода с чужого сайта и размещаю его у себя. Считывание и вывод я реализовал. Проблема в следующем. В этом коде могут содержаться ссылки на изображения. Но так как указанный сайт постоянно обновляется то обновляются и картинки. Как бы мне их закешироватьв?
Мне нужно две функции:
1) Я передаю ей хтмл код она находит в нем картинки и кеширует их. Возращается хтмл код, в котором содержатся новые ссылки на картинки (на мой сайт).
2) Очистка папки с картинками.

ЗЫ проблема в том, что с файлами никогда не работал


гм не совсем справился. Кто объяснит
Код:
$ftext = '<table border=0 cellPadding=0 cellSpacing=0 width=780>
   <tr><td bgcolor=#6f67b5 colspan=3><img src="/pic/tr.gif" width=1 height=1 border=0></td></tr>
   <tr>
      <td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
      <td bgcolor=#ffffff><img src="/pic/tr.gif" width=1 height=1 border=0></td>
      <td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
   </tr>
   <tr>

      <td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
      <td align=middle bgcolor=#6f67b5>
         <table border=0 cellpadding=0 cellspacing=0 width=778>
            <tr><td bgcolor=#6f67b5 class=white height=22 valign=top>Новости Hi-Tech индустрии</td></tr>
         </table>
      </td>
      <td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
   </tr>

   <tr>
      <td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
      <td bgcolor=#ffffff><img src="/pic/tr.gif" width=1 height=1 border=0></td>
      <td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
   </tr>
</table>';
preg_match_all('/<table(.*)<\/table>/i', $ftext, $content_arr);
$ftext = $content_arr[0][0];
echo($ftext);
?>

Где ошибка? Че ниче не выводит?
17K
26 октября 2006 года
Dionis
23 / / 29.08.2006
Схема такова:
1. Анализ кода, нахождение тегов img, вытаскивание путей.
Если пути относительные, то конвертация их в абсолютные.
Например в теге стоит:
/pic/tr.gif и это на сате mts.ru, тогда абсолютный путь будет
http://mts.ru/pic/tr.gif

2. Копирование этой картинки (а это по сути обычный файл) к себе на сервер функцией PHP copy в какую нибудь директорию

3. Исправление в коде старого пути к картинке на новый (хоть абсолютный, хоть относительный)

Можно еще вариант 2:
Полностью воссоздавать у себя такую же структуру папок и копировать картинки в эти папки. В этом случае в коде пути менять не надо. (лично я так и сделал). То есть у тебя на сайте будет папка pic и в в этой папке будет файл tr.gif

Ну а насчет
2) Очистка папки с картинками.
Что ж здесь сложного то... Проход циклом по всем файлам в каталоге, хошь выборочно удаляй по какому нибудь условию, хошь все удаляй...
8
27 октября 2006 года
mfender
3.5K / / 15.06.2005
Тема зацепила, сейчас попробую набросать что-нибудь...
8
27 октября 2006 года
mfender
3.5K / / 15.06.2005
Вот, и года не прошло:)
Предлагаю такой вариант:

Сначала определим некоторые полезные библиотечки:
Код:
interface IFileIO
{
    static function GetRemoteFile($Url);
    static function SaveLocalFile($Resource, $FileName);
}
 
interface IURL extends IFileIO
{
    static function GetAbsoluteUrl($Addr, $URL);
    static function ParseURL($URL);
    static function ExtractFileName($Str, $issetExt = false);
}
 
/*IMPLEMENTATIONS*/
class FileIO implements IFileIO
{
    static function GetRemoteFile($Url){ return file_get_contents($Url); }
    static function SaveLocalFile($Resource, $FileName){ file_put_contents($FileName, $Resource); }
}
 
class URL implements IURL
{
    static function GetAbsoluteUrl($Addr, $URL){
        $URL = self::ParseURL($URL);
        $PURL = self::ParseURL($Addr);
        $Query = isset($PURL['query']) ? "?{$PURL['query']}" : "";
        if (!isset($PURL['scheme'])){
            $Addr = "{$URL['scheme']}://{$URL['host']}/{$PURL['path']}{$Query}";
        }
        return $Addr;
    }
    static function ParseURL($URL){
        return parse_url($URL);
    }
    static function ExtractFileName($Str, $issetExt = false){
        $Path = self::ParseURL($Str);
        $Pat = preg_match("/\//", $Path['path']) ? "/^.*\/(\w+\.\w+|\w+)/" : "/^(\w+\.\w+|\w+)/";
        preg_match_all($Pat, $Str, $Arr, PREG_SET_ORDER);
        if (count($Arr)){
            if ($issetExt){
                if (!preg_match("/\w+\.\w+/", $Arr[0][1])){
                    return false;
                }
                else return true;
            }
            else return $Arr[0][1];
        }
        else return false;
    }
    static function GetRemoteFile($Url){}
    static function SaveLocalFile($Resource, $FileName){}
}
 
class ImageUtils
{
    static function GetImageInfo($URL){
        $Info = getimagesize($URL);
        switch ($Info[2]){
            case 1: $Ext = ".gif"; break;
            case 2: $Ext = ".jpg"; break;
            case 3: $Ext = ".png"; break;
            case 4: $Ext = ".swf"; break;
            case 5: $Ext = ".psd"; break;
            case 6: $Ext = ".bmp"; break;
            case 7: $Ext = ".tif"; break;
            default: "";
        }
        $Info['ext'] = $Ext;
        return $Info;
    }
 
    static function NormalizeImageExt($FileName, $Info){
        preg_match("/^([\w-]*)\.{0,1}/", $FileName, $Arr);
        return "{$Arr[1]}{$Info['ext']}";
    }
}


Ну и сама реализация всей этой беды:

Код:
// Пути, разумеется, следует поменять.
define("REMOTE_HTML", "http://hunter.kbtour.ru/photosession42.htm");
define("SAVE_HTML", "{$_SERVER['DOCUMENT_ROOT']}/probe.html");
define("IMAGE_DIR", "{$_SERVER['DOCUMENT_ROOT']}/primg/");
define("IMAGE_URL_PATH", "http://mfender/primg/");
set_time_limit(180);
if(!is_dir(IMAGE_DIR)) mkdir(IMAGE_DIR);
$DOC = new DOMDocument("1.0", "windows-1251");
@$DOC->loadHTML(file_get_contents(REMOTE_HTML));
foreach ($DOC->getElementsByTagName("img") as $Node){
    $Src = $Node->getAttribute("src");
    $Info = ImageUtils::GetImageInfo(URL::GetAbsoluteUrl($Src, REMOTE_HTML));
    $FileName = ImageUtils::NormalizeImageExt(URL::ExtractFileName($Src), $Info);
    $ImgURL = URL::GetAbsoluteUrl($Src, REMOTE_HTML);
    $Img = FileIO::GetRemoteFile($ImgURL);
    if(@$Img){
        FileIO::SaveLocalFile($Img, IMAGE_DIR.$FileName);
        $Node->setAttribute("src", IMAGE_URL_PATH.$FileName);
    }
}
$DOC->normalizeDocument();
$DOC->formatOutput = true;
FileIO::SaveLocalFile(html_entity_decode($DOC->saveHTML()), SAVE_HTML);


Комментировать лень. будут вопросы - задавайте.

=====
Note: При написании всей этой ахинеи не пострадало ни одного бенгальского тигра и вообще ни одно живое существо, кроме трёх бутылок пива. Автор выражает особую благодарность справочнику на сайте shaelf'а, которым пришлось воспользоваться, пока падал php.net.
8.8K
27 октября 2006 года
Alximik
95 / / 24.10.2006
эээээ нихрена не понял. Я вообще начинающий. Шо такое interface и static?
13
27 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=Alximik]эээээ нихрена не понял. Я вообще начинающий. Шо такое interface и static?[/QUOTE]
Читаем мануал
http://www.php.net/manual/en/language.oop5.php
8.8K
27 октября 2006 года
Alximik
95 / / 24.10.2006
[QUOTE=RussianSpy]Читаем мануал
http://www.php.net/manual/en/language.oop5.php[/QUOTE]
гм вроде ясно сенк

А с регЕкспами я мануал прочитал, но все равно не пашет :(
http://forum.codenet.ru/showthread.php?p=149528&posted=1#post149528
8.8K
28 октября 2006 года
Alximik
95 / / 24.10.2006
=====
Note: При написании всей этой ахинеи не пострадало ни одного бенгальского тигра и вообще ни одно живое существо, кроме трёх бутылок пива. Автор выражает особую благодарность справочнику на сайте shaelf'а, которым пришлось воспользоваться, пока падал php.net.[/QUOTE]
А можно тоже самое, но без использования DOMDocument???
Блин, а можно тоже самое, но без библиотек и т.д. Просто 2 функциии и все. Без наворотов.
[color="red"]
1. Не нужно писать по одной строчке в сообщении, если не кто не ответил, просто отредактируй своё.
2. Тут не нужны цитаты на полстраницы.
[/color]
244
30 октября 2006 года
UAS
2.0K / / 19.07.2006
А можно, а можно... Блин... мфендер всё отлично написал.. ты не представляешь как это надо будет парится искать эти теги путём регэкспов... А есди, как ты говоришь, сделать без библиотек и т.д., то од возрастёт в несколько раз.... Да! И не воскрешай темы и не занимайся оверквотингом! ]:-[
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог