Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
PHP — как сделать толковый кэш?
Просмотров: 325
 
Ответов: 9
Задача
Есть сайт — новостная лента. Двиг — самописный, PHP + MySQL. В данный момент с каждым посещением страницы информация формируется из БД.
Срочно надо перейти с динамики на статику.
То, как я придумал это сделать
- При первом посещении странички c id=1500 — содержимое берется из БД и записывается в файл cache/1500.html. Делается с помощью ob_start().
- При повторном посещении этой странички — смотрим дату создания файла 1500.html, если дата меньше 15 минут от тек. времени, инклудом выводим 1500.html. Если больше 15 минут — снова берем из БД и перезаписываем файл.
Вопросы
1. Комментарии к новостям. Получается, при добавлении нового комментария необходимо будет убивать файл 1500.html? Сайт живой, комментов много. Вот не знаю, я хард не задолбаю такими запросами?
2. Статистика количества просмотров новости. При каждом посещении продолжать делать «UPDATE `views` = `views` + 1» или может есть какое-то другое решение? А то выходит не до конца статика получится, если будут постоянно запросы в БД улетать.
Поделитесь, пожалуйста, мыслями по поводу такой реализации. Может кто-то уже внедрял что-то подобное, какие могут возникнуть проблемы? Может сущетсвуют подводные камни, о которых я пока не подозреваю?
Напишу, как я это сделал на одном из своих сайтов.
У меня все кешируется в memcached по ключам, которые строятся из хеша строки с параметрами (что-то типа id, page, action и т.д.). Страница ПОЛНОСТЬЮ складывается в кеш. Достается все моментально. При написании коммента (и любом другом изменении страницы) запись в memcached убивается и пересоздается при следующем запросе страницы. Раньше все было сделано в файлах на диске. Размер кеша где-то 400-500 мб со сжатием на лету. Странички имеют время жизни разное в зависимости от типа страницы, всякие каунтеры и голосовалки сделаны динамически через подзапрос. Тормозов нет абсолютно, все летает. P.S. сервак выделенный, конечно.
P.S. по поводу пункта 1 за хард переживать не стоит, если частые обращения к одному и тому же, скорее всего все будет в дисковом кеше в оперативке. Статистика и прочие каунтеры обновлять раз в 5-10 минут и нормуль.
Можно кэшировать сами запросы к БД, и проанализировать: кеш каких запросам следует очищать после того или иного действия.
Например после добавление нового комментария нужно почистить счётчик комментариев и выборку всех комментариев к данной статье, при этом запрос на кол-во просмотров статьи трогать не надо. (пример грубый).
Какие-то данные в кеше нужно будет очищать сразу после какого-то события, а какие-то данные можно очищать по времени (тот же счётчик кол-ва просмотров статьи).
Можно подумать о использовании тегов в кэше, а не просто по ключу сохранять.
Подумать об использовании системы кеширования: на файлах, memcache, redis, apc, и прочее…
Чтоб что-то более конкретное посоветовать нужно смотреть на эту ленту и прочие особенности реализации
sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html
Позволяет кэшировать ответы от апача как статику на определенное время, в зависимости от количества посещений страницы, cookie, аргументов. При добавлении коммента можно просто url менять на &updated=timestamp.
Статистику в данном случае лучше перевести на ajax и отдельный быстрый сервер типа node.js, чтобы оно клало ее в что-то типа redis. Тогда ее можно будет в любой момент перенести на отдельный сервер или выключить.
Во-первых, если на вас идет DDOS-атака, следует разбираться с DDOS-атакой, а не мощностями сервера. Это бессмысленно, увеличивать мощности, только чтобы атаку отбивать. Атаку отбивать надо специализированными для этого средствами. А то вы что-нибудь оптимизируете, атакующий усилит атаку, и пойдет бессмысленная гонка.
Анализируйте тип атаки, анализируйте ее принципы, настраивайте фильтры. Или найдите хостера, который, как ему и положено, будет этим заниматься сам.
сделайте «прослойку» из nginx + memcache
nginx настроить получать страницы из мемкэша по url
если такой страницы нет, то делать запрос «бэку», он будет формировать страницу, отдавать её + пихать в мемкэш
в гиг памяти влезет скорее всего весь сайт.
второй вариант чуть проще: связка nginx + varnish +apache. На апач ставить mod_evasive.
ну и настройки подобрать, вроде keepalive = 0.
1) 30-40К это не такая уж и большая посещаемость, у меня сервак выдерживал 65К
используй мемкеш однозначно, в нем, например, можно хранить не только контент, но и информацию об обновление и лишний раз трогать БД
( Статистика количества просмотров новости. При каждом посещении продолжать делать «UPDATE `views` = `views` + 1»).
эту инфу я бы точно держал в памяти. У меня в одном муз проекте вся статистика скачиваний за день (200-250К) хранится в мемкеше. А раньше дергалась БД (именно на UPDATE x=x+1) и сервак не слабо тормозил.
2) как уже советовали выше — если хранить контент в мемкеше, то можно настроить nginx так, чтоб он отдавал его напрямую не дергая бэкенд
3) если есть Аппач — то его в топку, используй php-fpm, ну я надеюсь, что всякие акселлераторы тоже используются.
есть куча статей на Хабре как можно улучшить производительность
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться