Набросок класса для кэширования результатов функций
Автор Сообщение
clk824 Не на форуме
Админ
*******

Сообщений: 675
Зарегистрирован: 01.2010
Сообщение: #1
Набросок класса для кэширования результатов функций
Не так давно меня заинтересовала тема кэширования результатов функций на PHP. Не то что-бы надеялся сделать что-то универсальное и полезное для всех, скорее просто эксперимент хотелось поставить. Результатом явился классик который я выкладываю здесь.
Сразу говорю что он не доделан и доделывать его я не планирую. Кэшируется в файлы. Кэш никак не очищается и политики поддержания его в адекватном состоянии никакой нет. Единственное что есть это время устаревания элемента в кэше.
Там же до кучи реализован некий тест выполняющий подсчёт SHA1 хэша над случайным файлом из заданной директории сначала без кэширования, а потом с ним. Лично я туда положил 30 mp3 файлов с именами 1,2,3,..,30.
Надоело уже рассказывать, кому надо спросит.

PHP код:
<?php

class FileCache {
    private 
$id;
    private 
$map = array();
    private 
$filecache_dir 'cache/';
    private 
$filecache_lifetime 5// время кэширования в секундах

    
function FileCache($id) {
        
$this->id $id;
    }

    function 
get($code) {
        
$key md5($code);
        
$filename $this->filecache_dir $this->id '-' $key;

        if (
file_exists($filename)) {
            
$filestat = (stat($filename));
            
$timestamp $filestat[9];
            if (
time() - $timestamp $this->filecache_lifetime) {
                echo 
"[SRCEXP] ";
                return 
$this->put($filename$code);
            } else {
                echo 
"[CACHED] ";
                return 
file_get_contents($filename);
            }
        } else {
            echo 
"[SRCNEW] ";
            return 
$this->put($filename$code);
        }
    }

    function 
put($filename$code) {
        
$value $this->run($code);
        
file_put_contents($filename$value);
        return 
$value;
    }

    function 
run($code) {
        
$func create_function(''"return $code;");
        return 
$func();
    }
}

// тестовая функция выполняющая "тяжёлую" операцию
function test($filename) { return sha1(file_get_contents($filename)); }

// запуск теста
function test_run($usecache) {
    
$fc = new FileCache('test');

    
$start_time microtime(1);

    for (
$i 1$i <= 30$i++)  { // test iterations
        
$n rand(1,30); // random file
        
$start_step_time microtime(1);

        
// вызываем тестовую функцию
        
if ($usecache)
            
$fc->get("test('data/' . $n)"); // с кэшированием
        
else
            
test('data/' $n); // без кэширования

        
echo sprintf("Step: %s; File: %s; Time: %f (%f); "$i$nmicrotime(1) - $start_step_timemicrotime(1) - $start_time);
    }

    echo 
'<hr>Total time: ' . (microtime(1) - $start_time) . '<br>';
}

// тест без кэша
echo '<h1>Direct read</h1>';
test_run(0);

// тест с кэшем
echo '<h1>Cached read</h1>';
test_run(1); 


Прикрепления
.php  filecache.php (Размер: 2.06 Кб / Загрузок: 120)





Хочешь сказать спасибо? Лучше нажми "Мне нравится", +1 или Like!
09.02.2010 2:51
Вебсайт Найти все сообщения Цитировать это сообщение
Создать ответ