Возник вопрос: как лучше реализовать статистику на PHP(возможно +MySQL)? Допустим, анализировать логи Apache долго и\или просто неудобно(по каким-то соображениям). У меня 2 варианта: 1. Писать при каждом вызове скрипта в базу отдельной строкой адрес, IP, возможно куки(или id пользователя), время и др. данные. Минус: - При большом количестве хитов нагрузка на БД будет очень большая, да и поиск и анализ 1 000 000 строк весьма небыстрый процесс... Плюс: - Максимум информации о пользователе 2. Сделать одну или несколько таблиц, где хранить статистику по годам, месяцам, дням(типа хитов, уников и т.д.), запрос будет посложнее, но данных будет в разы меньше. Минус: - Минимум данных о пользователе Плюс: - Высокая производительность Может кто знает иные подходы к решению данной проблемы? Что-то более оптимальное...
не использовать бд. идеальный вариант - настроенные под себя логи апача. периодически скриптом их парсить и заносить статистику в бд по дням.
Это, конечно, идеальный вариант, когда скрипт стоит на одном сервере. А если планируется размещение его на нескольких, заранее неизвестных серверах? Например, на моём хостинге логи апача хранятся в 5ти gz-архивах(каждый по неделе), где-то просто файлом, где-то в архиве файлом... Плюс местоположение файлов может быть разным. Поэтому я и прошу совета по поводу связки PHP+MySQL для сбора статистики.
Вот http://www.mysql.ru/docs/man/Insert_speed.html Но таблицу иногда можно очищать, архивируя устаревшие данные в файловой системе.
Мда, интересно получается. То есть вполне даже можно использовать первый вариант. Или, например, сделать буфферную таблицу, которая каждые сутки по крону сливалась бы в другую, которую и использовать собственно для анализа статистики... Спасибо за наводку
Sergey89, даже запуск php-скрипта для отдачи картинки это уже большая нагрузка. а ещё и коннект в километровую базу - это вообще пипец. ещё раз: не надо использовать бд. пиши в файл.
dark-demon, дык разницы-то? Что я пишу в файл - нагрузка на файловую систему, что я пишу в БД - нагрузка на БД. Только вот анализировать, используя БД, быстрее и удобнее...
имхо, все зависит от того, где именно в системе узкие места.. например, если посетителей много, и юзаются форумы типа phpbb и портал phpnuke, то я бы писал в файлы
host понимаешь, в чем еще разница... при перегрузе по файловой системе скрипт достаточно терпеливо ждет, пока настанет его очередь, в разумных пределах, естественно, а если вычерпать лимит по базе или просто "зависнуть" своими скриптами базу, то phpBB засранец временной локальной недоступностью ответит.. а так, ну лагает конечно... с другой стороны, если скрипт статистики подключать через <img src='log.php'>, то задержка будет не так и заметна для пользователя.
phpBB фтопку. ИМХО. Но это уже другой вопрос. По поводу файлов... Не думаю, что запись в файл будет быстрее вставки одной строки в БД. Ибо это надо открыть файл, записать, закрыть. А в бд подключение уже есть, осталось только запрос кинуть...
DarkElf + еще: если мне нужно вывести+ отсортировать в обратном порядке и удалить повторяющиеся значения, то где удобнее это сделать?
Кстати, всё-таки провёл тест. Использовал запрос "INSERT INTO stat (time, url, user_id) VALUES (UNIX_TIMESTAMP(), '/index.html', 1)", таблицу без индексов. Как в начале было по 20 секунд на 10 000 строк, так ближе к 1 000 000 строк и осталось, даже немного снизилось. Так что всё-таки выберу первый вариант... Или вариант с архивированием...
DarkElf В принципе, если важно чтобы все работало неважно как но лишь бы работало, то файлы, в др случаях - БД, правда если как ты говоришь вычерпать лимит по базе, то вообще работать временно не будет
Angerslave проведи тест с file_put_contents на эти же 10000 строк. Результаты тебя прятно удивят. PHP: file_put_contents('data.txt', time() . ' ' . $_SERVER['REMOTE_ADDR'], FILE_APPEND);
а если БД узкое место? а записей до хрена добавлять.. гы, PHP: <?php $f=file('log.log'); $cnt=count($f); for($cnt;$cnt;$cnt--){ echo $f[$cnt]; } ?> и они в обратном порядке
а вот запись по статистике и может стать последней каплей.. опять таки, все от конкретной ситуации зависит
Sergey89, 3 секунды на 10000 строк... Только вот с анализом понты... Да и файл легко можно случайно удалить...
Angerslave а если так уж нужно, то файл можно периодически заливать в базу=) файл заливается значительно быстрее, чем одиночные инсерты, а будут именно такие. и заливать его можно в 5 утра например, когда нагрузка значительно ниже.