LINUX.ORG.RU

количество просмотров страниц, все правильно?

 


0

1

я уже создавал тред, где вопрошал, как же лучше сделать количество просмотров страниц, ибо извините, но дергать базу ради целого sql-запроса, чтобы только сделать +1.. не нужная нагрузка.

поэтому лучшим вариантом было написать парсер access.log веб-сервера (по крону, каждые пару минут), где смотреть на запрашиваемый URI, распарсивать, создавать переменные с циферками, а потом залпом, одним запросом, обновить данные в базе.

Картинка: http://ompldr.org/vaWVxMA

Скрипт весь на картинке, но поясню: открываем файл fopen, читаем построчно fgets, достаем из каждой строки запрошенный URI (проверяем статус 200, чтобы небыло ошибок при SQL запросе), собственно парсим URI, - проверяем, что была запрошена нужная статья в блоге, страница, был загружен файл и т.д., и делаем +1 к переменной. А после, разом проходимся по всем переменным, собираем все в кучу и составляем один единственный SQL запрос на апдейт множества статей:

UPDATE blog_posts SET post_count_views = post_count_views + CASE post_uri 
  WHEN post-id-1 THEN 11111
  WHEN post-id-2 THEN 12345
  WHEN post-id-3 THEN 67890
END WHERE post_id IN (post-id-1,post-id-2,post-id-3)

Выполняем. ?????. PROFIT!.

Сперва думал сделать при помощи grep/sed/gawk, но мой опыт в регексах и прочих утилитах очень скуден, поэтому выбрал php, на котором можно написать тот-же скриптик и засунуть в крон /usr/bin/php /srv/http/sites/spfng.com/crond-2min.php на каждые две минуты. :)

Ну и, чтобы до кучи, я планирую дополнить сбор статистики еще прочим: все подозрительные запросы, попытки XSS/SQL атак и пр. будут складываться отдельно. После каждого парсинга лог будет очищаться - а зачем он нужен, если вся статистика собирается... За сим все. :)

UPD: и вот вам еще одно преимущество такого способа: кэширование. когда мы кэшируем страницу, то отдаваться она будет из кэша и счетчик +1 из скрипта больше срабатывать не будет. а вот записи в логах появляются всегда. поэтому количество просмотров страницы продолжает обновляться даже при последующем обновлении кэша.

★★★★★

мдя... сразу видно профи... ))) Дам намек, для +1 у SQL есть специальный query. Выполняется с минимальными затратами. Желаю и дальше костыли ковырять.

ihappy ()

Кажется, для такой реализации и `grep -c ' 200 .*html ' /var/log/access.log` вполне сгодится.

SunDoc ()

помоему логи ротируются, зачем их еще очищать или что-то там еще

зы. я бы взял редиску

trashymichael ★★★ ()

дергать базу ради целого sql-запроса, чтобы только сделать +1.. не нужная нагрузка
поэтому лучшим вариантом было написать парсер access.log веб-сервера (по крону, каждые пару минут)

ты идиот, уйди из профессии

anonymous ()

поэтому лучшим вариантом было написать парсер access.log веб-сервера

Таких велосипедов уже есть много. К примеру perl Parse::AccessLog

SunDoc ()

а зачем он нужен, если вся статистика собирается..

+1 - это далеко не вся статистика.

pi11 ★★★★★ ()
Последнее исправление: pi11 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.