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

Сразу скажу, у меня отключены глобальные переменные в htacess, не знаю есть ли связь с моим примером и данной настройкой.

global $qcache;

if(empty($qcache)){
$result = mysql_query("select * from menu");
echo 'empty cache';
$qcache = $result;
}else{
echo 'cache full';
}

while($row = mysql_fetch_array($qcache)){
echo $row['id'];
}

Хотя чувствую чушь получилась, особенно тут $row = mysql_fetch_array($qcache)



Спустя 31 минута, 55 секунд (4.07.2011 - 15:16) tatti написал(а):
похоже на салат. действительно чушь.

первое, что бросается в глаза - при обновлении глобальные переменные тоже обновляются(вы видимо не заметили).

Спустя 11 минут, 8 секунд (4.07.2011 - 15:28) maximka787 написал(а):
Раньше я кэшировал просто сессионный переменные,

session_start();
if(!isset($_SESSION['count_users'])){
$result = mysql_query("select * from users");
$row = mysql_fetch_array($result)
$_SESSION['count_users'] == $row['count'];
}
echo 'Всего пользователей '.$_SESSION['count_users'];
это пример вкратце.

но:
1. Боюсь сессионные переменные намного тяжелее обычных глобальных.
2. Там одно число, а я хочу использовать массив.

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


Спустя 52 секунды (4.07.2011 - 15:28) linker написал(а):
Конечно чушь. Обычно кэшируют готовый HTML-контент.

Спустя 46 секунд (4.07.2011 - 15:29) maximka787 написал(а):
Цитата
мне надо загнать самый популярные товары на главной в кэш, тк они вообще не обновляются, а обращений к главной много, смысл напрягать сервак.
я имею ввиду кэш в рамках одного пользователя, а не на самом сервере

Спустя 2 минуты, 11 секунд (4.07.2011 - 15:31) maximka787 написал(а):
linker
все равно, я могу мой контент загнать в ячейку базы данных, но выводить то эту запись все равно надо каждый раз. я и имею ввиду именно чтобы обращение к БД было один раз вначале .

Спустя 2 минуты, 47 секунд (4.07.2011 - 15:34) tatti написал(а):
жми сюда

Спустя 15 минут, 28 секунд (4.07.2011 - 15:50) linker написал(а):
Когда есть кэш готового HTML, то вообще ничего не надо делать, достаточно будет просто написать
echo $cache_html_content;
.

Спустя 9 минут, 8 секунд (4.07.2011 - 15:59) maximka787 написал(а):
linker
а тут не грамотно написал? суть в том что я просто хочу чтобы sql запрос сработал только один раз. в примере ниже я это сделал, но не уверен что это лучшее решение. Т.е по сути мне понять как вот это механизм сработает, а дальше я сам наворочу сложности.

session_start();
if(!isset($_SESSION['count_users'])){
$result = mysql_query("select * from users"); // AS count
$row = mysql_fetch_array($result)
$_SESSION['count_users'] == $row['count'];
}
echo 'Всего пользователей '.$_SESSION['count_users'];

Спустя 8 минут, 16 секунд (4.07.2011 - 16:07) linker написал(а):
Тут
$_SESSION['count_users'] = $row['count'];
А если за это время добавится еще пользователь или несколько? Данные будут устаревшие. Кэш нужен там, где нагрузка начинает приближаться или переваливать за возможности сервера. Сессии по умолчанию настроены на файлы, в случае такого кэша, прогиб по ИОПСам обеспечен. Читай в сторону memcache.

Спустя 7 минут, 17 секунд (4.07.2011 - 16:14) maximka787 написал(а):
linker
Цитата
Сессии по умолчанию настроены на файлы
тоесть сессионные файлы еще на сервере хранятся?

И еще такой момент, если например мой скрипт выводит результат в среднем за 0,008 секунд из 4х таблиц, то по сути это как минимум 125 одновременных нажатий выдержит при одновременном обновлении?

Если так то для моей системы это много даже значит можно вообще не бояться? smile.gif

Просто хотел главную страницу сделать по примеру статичной, но почитав про то что результат кэша храниться в файлах, понял что это врятли спасет, тк нагрузка на дисковую подсистему намного опасней чем на ОЗУ. На счет memcache наверно лучше всего смотреть.

Спустя 10 минут, 31 секунда (4.07.2011 - 16:25) waldicom написал(а):
Цитата (linker @ 4.07.2011 - 14:07)
прогиб по ИОПСам обеспечен

а ИОПСы это чуго? А то поиск по гуглу ничего не дал вразумительного? Что-то в сторону системы ввода/вывода?

Спустя 3 минуты, 44 секунды (4.07.2011 - 16:29) maximka787 написал(а):
waldicom
мне дал, это теория про структуры как я понял. можно сказать проблема обработке данных в самом сервере

Спустя 2 минуты, 23 секунды (4.07.2011 - 16:31) linker написал(а):
waldicom
Да, IOPS - Input Output Per Seconds.

maximka787
Суть кэша в том, чтобы для всех 100, 1000, миллиона пользователей показать только один закэшированный контент. Объясню, сессии принадлежат конкретному пользователю, следовательно, если в один момент времени зайдут тысяча пользователей, то будет выполнено тысяча запросов и сохранена тысяча результатов. Суть кэша в том, чтобы в данной ситуации выполнился минимум 1 запрос, сохранился минимум один результат, но отобразился он для всей тысячной аравы пользователей.
Вобщем думай.

Спустя 1 минута, 1 секунда (4.07.2011 - 16:32) waldicom написал(а):
Цитата (maximka787 @ 4.07.2011 - 14:29)
это теория про структуры как я понял. можно сказать проблема обработке данных в самом сервере

Это получается будет прогиб по структурам обработки данных в самом сервере? хм... понятнее не стало, подождем linker'а.

Спустя 34 секунды (4.07.2011 - 16:33) waldicom написал(а):
Цитата (linker @ 4.07.2011 - 14:31)
Да, IOPS - Input Output Per Seconds.

Ага, спасиб!

Спустя 4 минуты, 3 секунды (4.07.2011 - 16:37) maximka787 написал(а):
linker
гениально, жаль хостер не дает использовать memcached. спасибо, в целом все понятно.

Спустя 4 минуты, 19 секунд (4.07.2011 - 16:41) linker написал(а):
maximka787
Ну для начала можно попробовать реализовать это дело на файлах. Ну и не забываем производить оптимизацию как кода, так и sql-запросов.

Спустя 1 день, 15 часов, 53 минуты, 24 секунды (6.07.2011 - 08:34) ExpJ написал(а):
Глобальные переменные - это зло не используйте их!

Лучше пользоваться готовым фреймворком, например Zend Framework, там есть готовая и удобная компонента Zend_Cache. Есть фронтэнды (вы можете кешировать работу функций, методов, целых страниц вашего сайта ...) и бекенды (для хранения кеша можно использовать базу, файлы, memcached)

Спустя 7 дней, 2 часа, 37 минут, 39 секунд (13.07.2011 - 11:12) maximka787 написал(а):
Ребят, дошли руки до кеширования. Вот создал скрипт, который будет либо брать готовый файл, либо обновлять принудительно данные если они изменились. Посмотрите, имеет ли он недостатки какие?

$file_cache1 = '2.cache';

if (file_exists($file_cache1)){
echo '<p>Найден кэш файл</p>';
readfile($file_cache1);
} else{

echo '<p>кэш файла нет, создаем</p>';

ob_start();
?>
<table>
<
tr>
<
td>1</td>
</
tr>
</
table>
<?
// Получаем содержимое буфера
$buffer = ob_get_contents();

// Останавливаем буферизацию и очищаем буфер вывода
ob_end_clean();

// Сохранение кэш-файла с контентом
$fp = fopen($file_cache1, 'w');
fwrite($fp, $buffer);
fclose($fp);
}


_____________
..Работает - не трогай!
Быстрый ответ:

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