[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: применение серверного кеширования
Guest
почитал, разобрался что к чему, но ей Богу не пойму как использовать кэширование на сайте, точнее не вижу, где это было бы целесообразно.(почти)

сохраняем буфер допустим страницы index.php?p=1&c=3 в кэш, как md5("index.php?p=1&c=3").

- а как же сессия? то есть нам нужно на каждого пользователя свой кэш заводить, ну ли как-то так md5("index.php?p=1&c=3."$_SESSION[id]") ?

Приведите, пожалуйста, конкретное практическое применение кэширования.

пока что, мне приходит в голову кэшировать все страницы, например на 10 секунд, чтобы не нагружать сервер, если какой-нибудь умник будет шалить.

что дальше, где(как) еще это можно использовать кэширование на динамическом сайте(данные меняются достаточно часто) ?

очень жду ответов.







Спустя 4 минуты, 13 секунд (21.11.2010 - 21:42) kirik написал(а):
Например есть запрос:
SELECT ... FROM users WHERE id = $user_id

т.к тут есть четкая привязка к id юзера, кэшируем данные этого запроса с именем hard_query_$user_id. И так со всеми остальными.

А кэширование полных страниц в случае с динамическими данными (как вы предложили с сессией) лучше не делать ибо производительности это не прибавит.

Спустя 14 минут, 45 секунд (21.11.2010 - 21:57) Guest написал(а):
kirik
мммм, кажется что-то начинает проясняться.

то есть что-то типа того будет?

$my_id = md5("get_my_id".$_SESSION['id]')
if (get_cache($my_id))
{
$mysql_result_id = get_cache($my_id);
}
else
{
$mysql_result_id = mysql_query("SELECT ... FROM users WHERE id = '$_SESSION[id]'");
set_cache($my_id, 600)
}




Спустя 18 минут, 6 секунд (21.11.2010 - 22:15) kirik написал(а):
Guest
Да, все верно.
Только сессии лучше изначально хранить в кэше.

PS
Эмм.. я надеюсь вы говорите о кэшировании в память? Или все-таки на диск?

Спустя 1 час, 25 минут, 3 секунды (21.11.2010 - 23:40) Guest написал(а):
kirik

1) как хранить сессии в кэше?

2) помогите, пожалуйста, разобраться, на моем примере. Можете показать, как должны выглядеть функции get_cache() и set_cache(); ?





Спустя 1 час, 11 минут, 18 секунд (22.11.2010 - 00:51) Nikitian написал(а):
Можно сохранять не всю страницу, а часть. Например если у вас есть какой-нибудь хитрый алгоритм вывода каких-нибудь новостей, то абсолютно без разницы какой пользователь их смотрит, посему кэшируете этот участок отдельно и в следующий раз берёте его из кеша.

Спустя 1 час, 31 минута, 16 секунд (22.11.2010 - 02:22) kirik написал(а):
Цитата (Guest @ 21.11.2010 - 15:40)
1) как хранить сессии в кэше?

Записывать сериализованный массив в кэш. Если ваш кэш работает на файлах - этого лучше не делать. Стандартных механизм хранения сессий в php работает тоже на файлах. Так что смысла особого нет.

Цитата (Guest @ 21.11.2010 - 15:40)
2) помогите, пожалуйста, разобраться, на моем примере. Можете показать, как должны выглядеть функции get_cache() и set_cache(); ?

Спустя 20 минут, 50 секунд (22.11.2010 - 02:43) Guest написал(а):
kirik
спасибо, буду разбираться

Спустя 5 минут, 47 секунд (22.11.2010 - 02:49) Guest написал(а):
Nikitian
да, если по частям, то кое-что можно в кэш добавить.

+ метод, который удалял бы кэш при определенных действиях.
допустим, пока новость не изменяют(редактируют, удаляют и.т.д) брать ее всегда из кэша, а не загружать из бд.
если же изменили, то удаляем кэш, и при первом заходе на страницу создастся уже новый.

Правильно понимаю, надеюсь.

Спустя 57 секунд (22.11.2010 - 02:50) Guest написал(а):
если да, то завтра начну писать класс))

Спустя 31 минута, 14 секунд (22.11.2010 - 03:21) Nikitian написал(а):
Примерно правильно.
На больших нагрузках создание кэша по первому запросу не проканает, но для вас будет достаточным

Спустя 9 часов, 32 минуты, 39 секунд (22.11.2010 - 12:54) Guest написал(а):
Nikitian
как мне кажется из вышесказанного, то там, где возможно, лучше убивать кэш только временем, вне зависимости от того изменяли новость или нет? Главное установить правильное время, наверное.

+ вся структура у меня сейчас в голове, хочу на данный момент сделать кэш для mysql, добавлю всё в класс, по работе в мускулом,
только честно говоря, стыдно, но я что-то не пойму, как результат запроса в файл сохранить? (тип resource) o_O

Спустя 1 час, 5 минут, 4 секунды (22.11.2010 - 13:59) Nikitian написал(а):
Нет, кэш убивать надо во время изменения закешированных данных. Собственно в это время и надо его пересоздавать, а не по запросу. Объясняю почему. Некоторая тяжёлая операция выполняется 5 секунд и складывает свои результаты в кэш. У вас каждую секунду приходит пользователь и скрипт смотрит: кэша нет и начинает его создавать, через секунду заходит новый пользователь - кеша всё ещё нет и он тоже инициализирует процедуру тяжёлой операции и записи результата в кеш. И так 5 параллельных тяжёлых операций. А так как операции тяжёлые, то время выоплнения самой первой увеличивается пропорционально количеству потоков с этой операцией - получаем быстрорастущую нагрузку и никакого толка от кэша. Поэтому при обновлении данных надо сразу актуализировать кэш, в идеале до изменения данных.

Вы уверены, что вам требуется кэширование? Знаете, что у mysql есть встроенный механизм кэширования, который по умолчанию включен? Может имеет смысл оптимизировть запросы и бд, а не городить огород со сравнительно медленными файлами? Файловые операции чаще всего медленнее, чем простая выборка из базы.

Спустя 30 минут, 42 секунды (22.11.2010 - 14:30) linker написал(а):
Запись/чтение из/в кэша не является тяжелой операцией, вот запрос к мускулу может быть тяжелым. Видел финты на эту тему, ввиде двух кэшей, один основной, другой бэкапный. Если основной еще не сделался, то данные берутся из бэкапного.

Основное правило, не кэшировать то, что часто меняется.

Спустя 1 час, 32 минуты, 3 секунды (22.11.2010 - 16:02) Guest написал(а):
linker
спасибо за советы!

Напишите только кто-нибудь как записать в файл результат запроса.

 $mysql_result_id = mysql_query("SELECT ... FROM users WHERE id = '$_SESSION[id]'");


как мне данные типа "$mysql_result_id" записать в файл, так, чтобы потом его извлечь и использовать.

Спустя 5 минут, 15 секунд (22.11.2010 - 16:07) linker написал(а):
$mysql_result_id - ресурсный тип, т.е. указатель на некий ресурс, его никуда не запишешь. Надо сначала, получить данные из этого ресурса
$row = mysql_fetch_assoc($mysql_result_id);
а уже потом кэшировать. Но по моему в данном случае кэш не нужен вовсе ибо ты больше времени потратишь на проверку/получение значения из кэша, чем выполнится SQL-запрос.

Спустя 6 минут, 11 секунд (22.11.2010 - 16:13) Guest написал(а):
linker
почему же не нужен.

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

было бы хорошо сохранять результаты запросов.

Спустя 1 минута, 2 секунды (22.11.2010 - 16:14) Guest написал(а):
linker
ну да, если результат не записать, то получается тупик

Спустя 5 минут, 21 секунда (22.11.2010 - 16:19) linker написал(а):
Ты сказал, как закешировать результат вот этого
$mysql_result_id = mysql_query("SELECT ... FROM users WHERE id = '$_SESSION[id]'");
В других случаях, получаешь данные, сериализуешь, записываешь. Когда получаешь из кэша, то десериализуешь. Но файлами лучше не пользоваться, есть решения по-лучше, например, memcached. Но не всегда, наверное, хорошим тоном будет кэширование результатов запроса, старайся больше кэшировать уже готовый HTML-контент.

Спустя 4 минуты, 24 секунды (22.11.2010 - 16:24) Guest написал(а):
linker
memcached встроенная библиотека в php? ее установка не требуется?

готовый HTML-контент ведь кэшируют еще и сами браузеры? а причину, почему в данном случаиу меня не получится так сделать, я уже сказал. Но я еще покапаюсь, может что придумаю.

Спустя 6 минут, 21 секунда (22.11.2010 - 16:30) Guest написал(а):
а по какому принципу работает mysql_fetch_assoc() , как он обращается к ресурсу?

Спустя 19 секунд (22.11.2010 - 16:31) linker написал(а):
Memcached - это кэш-сервер. Устанавливается как демон (служба для винды). Так же, нужно поставить расширение memcache для php. Как работать, есть мануале на php.net

Я например, отключаю кэш в браузере. Что ты будешь делать?

Ну собственно я выше описал, как делать.

Спустя 19 минут, 54 секунды (22.11.2010 - 16:50) Nikitian написал(а):

class Cache{
function get($key){
return @unserialize(file_get_contents('./cachedir/'.md5($key)));
}
function set($key,$data){
return file_put_contents('./cachedir/'.md5($key),serialize($data));
}
}

$cache=new Cache;
$sql="SELECT ... FROM users WHERE id = '$_SESSION[id]'";
$mysql_result_id = mysql_query($sql);
$result=$cache->get($sql);
if($result===false){
//Кэша нет - создаём
$result=array();
if(is_resource($mysql_result_id) && mysql_num_rows($mysql_result_id)>0){
while($result[]=mysql_fetch_assoc($mysql_result_id)){
}
}

$cache->set($sql,$result);
}
if(is_array($result) && sizeof($result)>0){
foreach($result as $res){
//Здесь работаете с данными выборки
}
}



Это примерный код, не используйте его как данность! Просто как теоретически можно было бы сделать, но так делать не надо. Класс кэшера вообще специально написал так примитивно, чтобы понять, что вроде как работает, но надо переделать.

И, да, мемкеш лучше использовать, чем файлы для небольших объёмов данных. Если дёргаете сотни-тысячи записей или большие объёмы данных (текст, файлы), то лучше в файлы это пихать, чтобы не вытеснить более важные вещи из мекеша.

Спустя 6 минут, 2 секунды (22.11.2010 - 16:56) kirik написал(а):
Guest
Почитайте тут еще.

Спустя 59 минут, 14 секунд (22.11.2010 - 17:56) Guest написал(а):
благодарю всех!!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.