Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Функция кэширования, польза или вред
 
 автор: tima2010   (11.12.2012 в 12:55)   письмо автору
 
 

Привет!

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


<?php
function my_cache_add($cache_name$data='') {
    
$cache_key md5($cache_name);
    
$file=@fopen(dirname(__FILE__) . "/cache/".$cache_key.".txt","w+") or die("ERROR CACHE");
    
    if(
is_array($data)) {
        
$data serialize($data);
    }
    
    
fputs($file$data);
    
fclose($file);
}

function 
my_cache_get($cache_name) {
    
$cache_key md5($cache_name);
    
$file dirname(__FILE__) . "/cache/".$cache_key.".txt";
    if (
file_exists($file) && is_file($file)) {
        return  
file_get_contents($file);
    } else {
        return 
false;
    }
}
?>


Чтобы получить данные выполняю:

<?php
function my_news_images () {
    
$cache_key __FUNCTION__;
    if ( 
my_cache_get($cache_key) ) {
        return 
my_cache_get($cache_key);
    } else {
    
        
/*
        Выполняем запрос в базу данных
        
        $return = '...';
        */

        
my_cache_add($cache_key$return);
        return 
$return;
    }
}
?>


На сколько правильно данное решение? Функции сырые и не продуманы но принцип работы думаю понятен.

Может все таки лучше оставить лишние 50 запросов в базу чем каждый раз вызывать чтение файла? Или выбрать иной метод кэширования.

  Ответить  
 
 автор: Sfinks   (11.12.2012 в 15:13)   письмо автору
 
   для: tima2010   (11.12.2012 в 12:55)
 

Задумка, в принципе, стандартная и способна сильно уменьшить нагрузку на сервер. Но нужно додумывать и оттачивать.

Например вы файл читаете 2 раза:
if ( my_cache_get($cache_key) ) { 
    return my_cache_get($cache_key);
нужно заменить на хотя бы:
if ( $cache = my_cache_get($cache_key) ) { 
        return $cache;

И, нужно продумать принцип обновления кеша. Т.е. в вашем примере файл созданный 1 раз так и будет отдаваться все время своего существования и не обновится. Думаю так не должно быть.

Да, и что вы собираетесь в них хранить? Если результаты работы функций, то не стоит. Вы просто потеряетесь в этих кешах и не поймете в конечном итоге откуда у вас прут ошибки. А вот готовый вывод кешировать, или целиком довольно объемные блоки - это да, целесообразно.

  Ответить  
 
 автор: tima2010   (11.12.2012 в 15:19)   письмо автору
 
   для: Sfinks   (11.12.2012 в 15:13)
 

Да конечно, все сыро, спасибо.

Для обновления файлов, они будут обновляться к примеру при действии которые связаны с данными хранящимися в нем. Как бы перезапись файла если изменились данные.

Выходит, если есть цикл (грубый и не аккуратный) отображающий к примеру запись с картинкой которую нужно достать из базы, лучше 20 раз открыть файл нежели 20 раз отправить запрос в базу?

  Ответить  
 
 автор: Sfinks   (11.12.2012 в 16:03)   письмо автору
 
   для: tima2010   (11.12.2012 в 15:19)
 

> лучше 20 раз открыть файл нежели 20 раз отправить запрос в базу?
Да, конечно.

Главное, исключить возможность ситуации, когда окажется, что одновременно 2 параллельных потока пишут в один и тот же файл.

  Ответить  
 
 автор: tima2010   (11.12.2012 в 16:19)   письмо автору
 
   для: Sfinks   (11.12.2012 в 16:03)
 

Большое спасибо!
Я не знал что вызывает большего вреда :) теперь буду продумывать функцию дальше.

  Ответить  
 
 автор: skydemon   (22.12.2012 в 23:13)   письмо автору
 
   для: tima2010   (11.12.2012 в 12:55)
 

MemCache как вариант тоже может подойти. Пример использования memcache это соц сеть facebook. И нечего собственного реализовывать не нужно.... Плюс в том что файлы не будут много места занимать. Минус это установка но там просто все

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования