За последние 24 часа нас посетил 58001 программист и 1845 роботов. Сейчас ищут 1077 программистов ...

Реализация системы статистики

Тема в разделе "Прочие вопросы по PHP", создана пользователем Angerslave, 11 авг 2007.

  1. Angerslave

    Angerslave Guest

    Возник вопрос: как лучше реализовать статистику на PHP(возможно +MySQL)? Допустим, анализировать логи Apache долго и\или просто неудобно(по каким-то соображениям). У меня 2 варианта:

    1. Писать при каждом вызове скрипта в базу отдельной строкой адрес, IP, возможно куки(или id пользователя), время и др. данные.

    Минус:
    - При большом количестве хитов нагрузка на БД будет очень большая, да и поиск и анализ 1 000 000 строк весьма небыстрый процесс...

    Плюс:
    - Максимум информации о пользователе

    2. Сделать одну или несколько таблиц, где хранить статистику по годам, месяцам, дням(типа хитов, уников и т.д.), запрос будет посложнее, но данных будет в разы меньше.

    Минус:
    - Минимум данных о пользователе

    Плюс:
    - Высокая производительность

    Может кто знает иные подходы к решению данной проблемы? Что-то более оптимальное...
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    не использовать бд. идеальный вариант - настроенные под себя логи апача. периодически скриптом их парсить и заносить статистику в бд по дням.
     
  3. Angerslave

    Angerslave Guest

    Это, конечно, идеальный вариант, когда скрипт стоит на одном сервере. А если планируется размещение его на нескольких, заранее неизвестных серверах? Например, на моём хостинге логи апача хранятся в 5ти gz-архивах(каждый по неделе), где-то просто файлом, где-то в архиве файлом... Плюс местоположение файлов может быть разным. Поэтому я и прошу совета по поводу связки PHP+MySQL для сбора статистики.
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Разве один INSERT- это большая нагрузка?
     
  5. Angerslave

    Angerslave Guest

    Sergey89, один инсерт нет, а один инсерт в миллионную базу - да... Хотя... Ща, проведу тест.
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Вот http://www.mysql.ru/docs/man/Insert_speed.html
    Но таблицу иногда можно очищать, архивируя устаревшие данные в файловой системе.
     
  7. Angerslave

    Angerslave Guest

    Мда, интересно получается. То есть вполне даже можно использовать первый вариант. Или, например, сделать буфферную таблицу, которая каждые сутки по крону сливалась бы в другую, которую и использовать собственно для анализа статистики... Спасибо за наводку :)
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Sergey89, даже запуск php-скрипта для отдачи картинки это уже большая нагрузка. а ещё и коннект в километровую базу - это вообще пипец.
    ещё раз: не надо использовать бд. пиши в файл.
     
  9. Angerslave

    Angerslave Guest

    Хм, пока писал, Sergey89 меня уже опередил :)
     
  10. Angerslave

    Angerslave Guest

    dark-demon, дык разницы-то? Что я пишу в файл - нагрузка на файловую систему, что я пишу в БД - нагрузка на БД. Только вот анализировать, используя БД, быстрее и удобнее...
     
  11. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    имхо, все зависит от того, где именно в системе узкие места.. например, если посетителей много, и юзаются форумы типа phpbb и портал phpnuke, то я бы писал в файлы
     
  12. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    DarkElf
    Могут быть глюки если на странице в онлайне сидят 5, 10, 100, 1000 чел (с файлами)
     
  13. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    host

    понимаешь, в чем еще разница...

    при перегрузе по файловой системе скрипт достаточно терпеливо ждет, пока настанет его очередь, в разумных пределах, естественно, а если вычерпать лимит по базе или просто "зависнуть" своими скриптами базу, то phpBB засранец временной локальной недоступностью ответит.. а так, ну лагает конечно...

    с другой стороны, если скрипт статистики подключать через <img src='log.php'>, то задержка будет не так и заметна для пользователя.
     
  14. Angerslave

    Angerslave Guest

    phpBB фтопку. ИМХО. Но это уже другой вопрос. По поводу файлов... Не думаю, что запись в файл будет быстрее вставки одной строки в БД. Ибо это надо открыть файл, записать, закрыть. А в бд подключение уже есть, осталось только запрос кинуть...
     
  15. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    DarkElf
    + еще: если мне нужно вывести+ отсортировать в обратном порядке и удалить повторяющиеся значения, то где удобнее это сделать? ;)
     
  16. Angerslave

    Angerslave Guest

    Кстати, всё-таки провёл тест. Использовал запрос "INSERT INTO stat (time, url, user_id) VALUES (UNIX_TIMESTAMP(), '/index.html', 1)", таблицу без индексов. Как в начале было по 20 секунд на 10 000 строк, так ближе к 1 000 000 строк и осталось, даже немного снизилось. Так что всё-таки выберу первый вариант... Или вариант с архивированием...
     
  17. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    DarkElf
    В принципе, если важно чтобы все работало неважно как но лишь бы работало, то файлы, в др случаях - БД, правда если как ты говоришь вычерпать лимит по базе, то вообще работать временно не будет
     
  18. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Angerslave проведи тест с file_put_contents на эти же 10000 строк. Результаты тебя прятно удивят.
    PHP:
    1. file_put_contents('data.txt', time() . ' ' . $_SERVER['REMOTE_ADDR'], FILE_APPEND);
     
  19. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Angerslave, разница колоссальна!
    host, глюки могут быть только от криворучия =)
     
  20. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    почитай про файловую систему и ее минусы в отличие от БД
     
  21. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    а если БД узкое место? а записей до хрена добавлять..

    гы,
    PHP:
    1. <?php
    2. $f=file('log.log');
    3. $cnt=count($f);
    4. for($cnt;$cnt;$cnt--){
    5.     echo $f[$cnt];
    6. }
    7. ?>
    8.  
    и они в обратном порядке;)
     
  22. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    а вот запись по статистике и может стать последней каплей..

    опять таки, все от конкретной ситуации зависит
     
  23. Angerslave

    Angerslave Guest

    Sergey89, 3 секунды на 10000 строк... Только вот с анализом понты... Да и файл легко можно случайно удалить...
     
  24. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    ORDER BY a ASC или же DESC :)
    гы
     
  25. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Angerslave

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

    и заливать его можно в 5 утра например, когда нагрузка значительно ниже.