Как вы бы посоветовали поступить?

Фруталити

Новичок
Здравствуйте.

Имеется таблица news, в ней id, текст, заголовок, дата и т.п.

Имеется некий скрипт news.php, выводящий, ну, скажем, 20 последних новостей на сайт. Имеются пользователи и администраторы.

Сейчас новости выводятся по такой схеме:
PHP:
function showTextNews($authorizated)
  {
$res = mysql_query("SELECT * FROM `news` WHERE `cid`=2 ORDER BY `id` DESC LIMIT 20");
while ($row = mysql_fetch_array($res))
{
//тут пошло-поехало, и на выходе имеем чистый html, заключенный в переменную $html
//т.е. и непосредственно HTML, и результат запроса
//в том числе (ВНИМАНИЕ), ссылки на изменение и удаление новости, отображаемые только администраторам (для проверки тут используется переменная $authorizated, но это не суть важно, думаю)
}
return $html;
}
Небольшое отступление: я, как вы поняли, совершенно непрофессиональный программист, так что если где есть "идейно-неправильные" реализации банальных вещей, я правда буду рад выслушать критику.

Короче, такая схема прекрасно работала, пока я не столкнулся с проблемой кэширования. Использую Cache_Lite.

Вопрос: как бы мне так закэшировать, чтобы нагрузка была минимальной?

Я по части СУБД почти полный ноль, но вот как я рассуждал: без кэширования выполняется 1 запрос каждый раз, когда кто-то хочет почитать новости.

С кэшированием, если я хочу показывать отдельно кэш для админов (ссылки на редактирование, удаление новостей), получаем 20 запросов, чтобы выдернуть из БД тексты, и еще 20, чтобы выдернуть id-шники - и, соответственно, все так красиво в функции оборачиваем, а функции уже вызываем в news.php столько раз, сколько надо (в данном случае 20). В итоге имеем 40 запросов, чтобы сформировать кэш (один раз), и каждый раз при добавлении/удалении/изменении новости.

Шестым чувством ощущаю, что можно сделать как-то по-человечески, попроще, но не могу сообразить как.

Поможете?

С уважением, Александр.
 

Фруталити

Новичок
Ну, я рассуждаю так (стыдно, но больше ничего не знаю, вот и хочу научиться): пишем функцию showtitle($id), которая по id будет выдергивать заголовки. Аналогично для текстов.

Кэшировать будем эти самые заголовки и тексты новостей (файловый кэш, используем cache_lite). При выводе надо показывать 20 последних заголовков и 20 текстов, плюс для админов нужно показать свои ссылки (так что их кэшировать нельзя).

В выводе будет такая логика:
если кэш есть, то выводим из кэша (заголовок), иначе SELECT(...)
выводим ссылки для админов
если кэш есть, то выводим из кэша (текст), иначе SELECT(...)
И так 20 раз (если 20 новостей на страницу). Почему бы тупо не кэшировать всю страницу с одним запросом? Да все из-за этих админских ссылок. Админ зашел, кэш с ними создался; пользователь зашел - взял страничку из кэша, а там ссылки.

Тут разве что делать два разных кэша для админа и юзера, об этом только сейчас подумал. А вы что посоветуете?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
С какого перепуга 20 раз? у тебя _ОДИН_ запрос который уже получил __20 СТРОК__.

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

Фруталити

Новичок
С какого перепуга 20 раз? у тебя _ОДИН_ запрос который уже получил __20 СТРОК__.

Выборка 20-ки последних в твоем случае это копеечная операция, и выигрыш минимальный, если он будет вообще.
Кеш может быть один. Одминские ссылки можно рисовать динамически, к примеру джаваскриптом.
Разве функция в php может вернуть массив значений? Те самые 20 строк. Вот у меня в голове просто не укладывается, вот делаю я функцию, которая возвращает одно значение (ну нельзя же массив возвращать.. или можно?), и 20 раз ее вызываю. Если писать "быдлокодом", как я и делал раньше, то конечно все четко, один запрос, 20 строк, и делай с ними что хочешь, а если все-таки пытаться сделать код более читабельным и все такое?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
и 20 раз ее вызываю
Зачем и что конкретно ты вызываешь 20 раз?

showTextNews?

Это по-твоему ТРУшнее и читабельнее?

Что мешает получить то, что нужно сразу и не сношать БД?
 

Фруталити

Новичок
Да блин, как бы объяснить-то, мне уже самому смешно :)
Конечно удобнее и круче одним запросом все сделать. Но как быть с кэшированием? Всякие обходные пути с JS допустим не подходят, нужно нормальные ссылки получить, именно в таком порядке:
заголовок
ссылки
текст

Заголовок и текст из кэша (и админам и юзерам), ссылки или из какого-то админского кэша отдельного или чего, но чтобы страница выглядела как полагается - юзверю юзверево, админу админское. Вот как конкретно из полученного $row (где 20 строк, содержащих и заголовки и тексты и id и все остальное) получить то, что требуется?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
в твоем коде ты уже получил нужные данные.
while ($row = mysql_fetch_array($res))
{
$a[] = $row['id'] . $row['title'];
}
return $a;
 

Фруталити

Новичок
Спасибо большое, наконец-то я догнал, с утречка завтра и поколупаюсь. Думаю, дальше с этим проблем не возникнет. Спасибо еще раз. Спать спать спать.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
$key_name = 'cache_for_users';
if($auth->isAdmin(){
$key_name = 'cache_for_admin';
}
if(!$data = $cache->get($key_name)){
$data = get_content_from_database();
$cache->set($key_name, $data);
}
echo $data;
 

KorP

Новичок
если у проекта такая нагрузка что требуется оптимизация - не понятно почему вопрос задаёт человек, далёкий от БД и программирования и не понимающий как работает то, что уже написано. очень интересно
 
Сверху