Поиск, существует ли динамическое имя файла среди тысяч файлов - PullRequest
0 голосов
/ 15 мая 2010

Я пишу кеш-модуль на PHP. Он пытается записать кэш с $string+timestamp в качестве имени файла.

У меня нет проблем с записью в кеш.

Проблема в том, что я делаю цикл foreach, чтобы получить нужный кеш.

Это логика, которую я использую для получения кеша:

foreach ($filenames as $filename){ 
    if(strstr($filename,$cachename)){//if found 
        if(check_timestamp($filename,time()))
                          display_cace($filename);  
        break;
    } 
}

Но когда он пытается получить и прочитать кэш, он замедляет работу сервера. Представьте, что у меня есть 10000 файлов кэша в папке, и мне нужно проверить каждый файл в этой папке кэша.

Другими словами, я пишу файл кэша в этом формате filename_timestamp. Например: cache_function_random_news_191982899010 в папке ./cache/.

Когда я хочу получить кеш, я передаю только cache_function_random_news_ и рекурсивно проверяю эту папку. Если я найду что-нибудь с этой иглой в имени файла, покажу его и сломаю.

Но рекурсивная проверка 10000 файлов в папке - это не очень хорошая вещь, верно?

Какой лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 15 мая 2010

Браузеры и веб-серверы решают проблему обслуживания кэша, поддерживая «индекс». Вы можете сохранить этот индекс в файле (двоичном / текстовом) или в базе данных.

Например:

  1. Каждый раз, когда вы создаете новый файл кэша, добавьте строку / запись в таблицу / файл.
  2. Тогда просто используйте таблицу / файл для быстрого поиска существования файла кэша
  3. Вы также можете пометить ненужные / устаревшие файлы, используя флаг в записи
  4. Затем периодически (используя задание Cron или другой метод) удаляйте устаревшие файлы кэша.

Такой подход значительно улучшит производительность.

1 голос
/ 09 ноября 2010

Не храните отметку времени как часть имени файла, но сохраняйте ее в файле вместе с кэшированным содержимым в каком-то формате, который имеет смысл для вас. Например:

Файл /cache/cache_function_random_news:

191982899010
stored content

Первая строка файла содержит метку времени, которую вы можете прочитать при необходимости, например, при очистке кеша периодически. Остальная часть файла содержит кэшированный контент. Другой возможностью было бы использовать сериализованные массивы. В любом случае, это делает тривиальным чтение кеша:

if (file_exists('cache/cache_function_random_news')) ...
0 голосов
/ 10 ноября 2010
function rpl_cache_get($cachename, $time=''){
    $ci=&get_instance();
    $ci->load->helper('directory');

    //getting the file in cache folder.
    if(is_file(BASEPATH.'cache/'.$cachename)){  
        //current time is less then the time cache expire
        //get the data.
        $f = fopen(BASEPATH.'cache/'.$cachename,"r");
        $content = fread($f,filesize(BASEPATH.'cache/'.$cachename)); 
        if ( ! preg_match("/(\d+TS--->)/", $content, $match))
        {
            return FALSE;
        }
        // Has the file expired? If so we'll delete it.
        if (time() >= trim(str_replace('TS--->', '', $match['1'])))
        {       
            @unlink(BASEPATH.'cache/'.$cachename);  

            log_message('debug', "Cache file has expired. File deleted");
            return FALSE;
        } 
        $content = str_replace($match['0'], '', $content); 
        fclose($f);

        return unserialize($content); 
    }

    return false;
}

эта система кэширования сохраняет блоки html в сериализованный массив php. а затем с помощью функции выше читает его, десериализует и возвращает массив htmls. вам просто нужно отобразить их, используя echo или print_r

function rpl_cache_write(&$data,$name,$timelimit){  
    $timesecond = $timelimit * 60;
    $cache_timestamp = time() + $timesecond;

    $f = fopen(BASEPATH.'cache/'.$name,"w");
    if($f != FALSE){
        $content = $cache_timestamp.'TS--->'.serialize($data);      
        fwrite($f,$content,strlen($content));       
        fclose($f);

        return true;
    } else {
        //todo : throw error cannot write cache file
        //echo "cannot write cache";
    }
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...