Особая ситуация с нагруженным проектом, как кешировать?

CrazyPHP

Новичок
Особая ситуация с нагруженным проектом, как кешировать?

Есть высоконагруженный проект. Выгодно ли будет кешировать данные о юзерах (в виде файлов на диске сервера (другие варианты не возможны!))? При этом кол-во файлов будет: десятки тысяч. Будет ли кеш в этом случае работать быстрее чем выборка из БД (MySQL)?
 

kruglov

Новичок
Кэшировать надо агрегатные данные (топ-100 пользователей, к примеру).
 

kruglov

Новичок
Если выборки только по ID (include($id)), то вполне стоит.

А вообще, универсального совета нету, от условий зависит.
 

whirlwind

TDD infected, paranoid
> чё ещё можно сделать?

Все, что выглядит как статика, должно быть статикой.
 

HraKK

Мудак
Команда форума
kruglov
Разве это будет "ощутимо" быстрее чем выборка по primiry key?
 

MiksIr

miksir@home:~$
в некоторых случаях и доставка почтой может быть быстрее, чем запрос в базу или чтение с диска.
 

Wicked

Новичок
может memcache? :)

HraKK
имхо, кэш призван, в первую очередь, не уменьшать latency, а защищать базу данных от нагрузки.
 

confguru

ExAdmin
Команда форума
Тока не забудь правильное дерево директорий создать для кеширования :)
И как будет сбрасываться кешь тоже подумай... :)
 

CrazyPHP

Новичок
Разве это будет "ощутимо" быстрее чем выборка по primiry key?
ммммммм......

-~{}~ 25.08.08 21:46:

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

-~{}~ 25.08.08 21:47:

не у меня возможен вариант только с диском.
 

Wicked

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

Иван 76

Новичок
Во-первых, нужно узнать истинные причины нагрузки. Для этого было бы неплохо взглянуть в Логи сервера, или сделать свою статистику вызовов страниц. Последний вариант более удобен, т.к. логи сервера забиты информацией о картинках, баннерах, кнопочках, html, js, css и прочей информацией, которая не создает нагрузки на PHP.

В данном случае нельзя полагаться на графические счетчики рейтинговых систем и систем статистики, т.к. они не показывают главного источника нагрузки - поисковых роботов и спам-ботов!

Во вторых. Необходимо начать фильтровать доступ к сайту, - делать запрет для спам-ботов. Существует много методик их вычислять.

В третьих. Нагрузка большого проекта порождается не количеством посетителей, а количеством страниц в проекте. Чем их больше, - тем больше страницы вызываются поисковыми ботами. В среднем, для проекта средней крупности, нагрузка ботов превышает 90% от общей нагрузки. (к примеру, - статистика рядового и не очень крупного проекта до начала работ по снижению нагрузки. За сутки, - 91000 вызовов страниц, не считая php-скриптов рекламных баннеров, счетчиков статистики и пр. Из них, - около 4000, - это живые люди.)

А посему, - необходимо использовать директиву crawl-delay для того чтобы манипулировать паузой между вызовами сраниц поисковыми ботами. Эту директиву хорошо понимают Яндекс, Yahoo, MSN-bot (live) и пр.

Для воздействия на Гугл необходимо указать периодичность вызова страниц через панель управления вебмастера.

Всяким там китайским и прочим поисковым ботам (если они Вам конечно не нужны), - запрет в robots.txt

Далее - необходимо отфильтровать мусорные страницы. Здесь речь идет как про robots.txt, так и про 404 для несуществующих страниц.

Очень часто, индексы поисковых систем забиты мусорной информацией. Часто причиной этого служат пагинаторы. Пагинатор для несуществующей страницы должен отдавать 404. Часто бывает, что вы, например, изменили расположение рубрик в доске объявлений, и идентификатор популярной рубрики с большим количеством объявлений резко стал идентифицировать малопопулярную рубрику, в которой к-во страниц в сотни раз меньше. Поисковые системы должны это увидеть в виде статуса 404.

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

Теперь насчет кеширования.
Многие поисковики (а ведь основную нагрузку создают именно они) прекрасно понимают статус 304 Not Modified! Грех не использовать это. По этим же соображением, желательно стараться избегать показов случайно-сгенерированного или частоменяющегося содержимого на страницах с конечной информацией, если вы генерируете HTTP_IF_NONE_MATCH на основе контрольной суммы, хеша содержимого страницы.

В ряде случаев, целесообразней использовать HTTP_IF_MODIFIED_SINCE.

Одна из самых длительных операций PHP - это принт. Поэтому, необходимое ее максимально сократить. Используйте сжатие страниц перед их отдачей. Закрывайте перед отдачей соединение базы данных, чтобы не превысить лимита соединений.

Теперь по поводу кеширования. В ряде случаев, персональную информацию (как то персональное меню авторизованного пользователя вместо авторизационной формы) можно внедрять в "дырку в теле кеша", в своеобразное динамическое окно в кеше, тем самым сильно сэкономить дисковое пространство. Посмотрите, как это реализовано в Smarty или http://popoff.donetsk.ua/text/work/light/

Для точеной очистки кеша используйте "метки" кеша. Опять же:
http://popoff.donetsk.ua/text/work/light/
http://framework.zend.com/manual/en/zend.cache.theory.html#zend.cache.tags
http://dklab.ru/lib/Dklab_Cache/

Такой подход является спасительным для крупного проекта.

>в виде файлов на диске сервера (другие варианты не возможны!)
Думаю, - Вы ошибаетесь. Рекомендую именно БД для кеша. Можно и SQLLite (обычно она есть на всех хостингах).

PS: В принципе, у меня есть небольшая библиотека для кеширования, которая создает "некешируемые, динамические" фрагменты в теле кеша, кеширует http-заголоки, метит кеш, причем ключ метки может содержать множественное значение (для страниц типа &category[]=38&category=25[]&...), широко использует кэширование на стороне клиента, данные хранит в текстовых файлах или в БД.

Но я писал ее давно, она в процедурном стиле, и нет времени красиво ее оформить в виде класса. Поэтому, дабы избежать всеобщего нарекания в свой адрес, я не хочу ее афишировать. Рекомендую внимательно изучить
http://dklab.ru/lib/Dklab_Cache/
и покопаться в http://popoff.donetsk.ua/text/work/light/
 

korchasa

LIMB infected
90% процентов от нагрузки это не слишком? Только что посчитал на живом проекте, получилось ~15%.

Одна из самых длительных операций PHP - это принт. Поэтому, необходимое ее максимально сократить.
Выполнение операции медленное, или отдача "тормозному" клиенту?

Используйте сжатие страниц перед их отдачей.
Кому как. Мне проц на морде дороже.

Вообще советы, ИМХО, сильно подходят для редкоизменяющихся страниц, где нет JIP контроллов.
 
Сверху