|
|
|
| Привет!
Смотря на количество запросов в базу решил подумать, как можно их уменьшить. Для этого написал функцию которая записывает данные в 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 запросов в базу чем каждый раз вызывать чтение файла? Или выбрать иной метод кэширования. | |
|
|
|
|
|
|
|
для: 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 раз так и будет отдаваться все время своего существования и не обновится. Думаю так не должно быть.
Да, и что вы собираетесь в них хранить? Если результаты работы функций, то не стоит. Вы просто потеряетесь в этих кешах и не поймете в конечном итоге откуда у вас прут ошибки. А вот готовый вывод кешировать, или целиком довольно объемные блоки - это да, целесообразно. | |
|
|
|
|
|
|
|
для: Sfinks
(11.12.2012 в 15:13)
| | Да конечно, все сыро, спасибо.
Для обновления файлов, они будут обновляться к примеру при действии которые связаны с данными хранящимися в нем. Как бы перезапись файла если изменились данные.
Выходит, если есть цикл (грубый и не аккуратный) отображающий к примеру запись с картинкой которую нужно достать из базы, лучше 20 раз открыть файл нежели 20 раз отправить запрос в базу? | |
|
|
|
|
|
|
|
для: tima2010
(11.12.2012 в 15:19)
| | > лучше 20 раз открыть файл нежели 20 раз отправить запрос в базу?
Да, конечно.
Главное, исключить возможность ситуации, когда окажется, что одновременно 2 параллельных потока пишут в один и тот же файл. | |
|
|
|
|
|
|
|
для: Sfinks
(11.12.2012 в 16:03)
| | Большое спасибо!
Я не знал что вызывает большего вреда :) теперь буду продумывать функцию дальше. | |
|
|
|
|
|
|
|
для: tima2010
(11.12.2012 в 12:55)
| | MemCache как вариант тоже может подойти. Пример использования memcache это соц сеть facebook. И нечего собственного реализовывать не нужно.... Плюс в том что файлы не будут много места занимать. Минус это установка но там просто все | |
|
|
|