• 14450
  • 181
  • 10
Нравится блог?
Подписывайтесь!

Как делался счётчик посещений на iNternets.kz

В продолжение предыдущего поста Асинхронность PHP сегодня я расскажу, как применялись эти знания на практике.

Больше двух лет назад впервые увидел свет очередной мой проект - каталог казахстанских сайтов iNternets.kz. Тогда это действительно был только каталог сайтов, но очень быстро пришло понимание того, что такой сайт не особо интересен нашим веб-мастерам и недостаточно конкурентоспособен. Я начал обвешивать его дополнительными функциями - проверка ТИЦ и PR, оценка семантичности вёрстки и, как естественное продолжение каталога сайтов - система статистики.

Изначально было принято решение, что основным станет невидимый счётчик, а графический будет опцией и размещение любого счётчика (как и обратной ссылки) будет сугубо добровольным.

Первая версия счётчика производила запись в таблицу MySQL напрямую, из этой же таблицы с помощью чудовищных COUNT'ов и группировок вытаскивались отчёты. Когда я разместил этот счётчик на двух сайтах, посещаемостью 2000 уникальных визитов в сутки, время ответа скрипта счётчика составило больше секунды, а отчёты создавались за 8-10 секунд. Отвратительно.

Во второй версии данные записывались уже в несколько табличек (отдельно лог по разрешениям экранов, по достигнутым целям, по странам и т.п.). Кроме того, таблички чистились от старых данных (больше месяца). Это ускорило генерацию отчётов, но счётчик по-прежнему тормозил.

В третьей версии решено было сделать счётчик асинхронным - общий по всем сайтам лог посещений записывался в базу SQLite, а cron-скрипт раз в минуту разбирал её и обновлял таблицы в MySQL'е. Это позволило сильно ускорить генерацию счётчика и я расхрабрился настолько, что установил его на сайт с ежедневной посещаемостью около 20 000.

Этот шаг вскрыл ещё одну проблему. Теперь за выделенную минуту не успевала обрабатываться очередь в SQLite-базе. Не спасала блокировка с помощью pid-файла: очередь росла быстрее, чем скрипт её обрабатывал.

Чтобы решить эту проблему, я стал записывать посещения в 10 разных файлов по схеме:
$db_filename = (time() %10) . ".log";
А обработку очереди я разделил на 10 независимых "потоков" (потоками в полном смысле этого слова такое решение назвать никак нельзя, но и полноценные потоки здесь, в принципе, не нужны):

$dh = opendir($counter_log_dir);
while($file = readdir($dh)) {
if(preg_match("/\.log$/i", $file)) {
system("php -q counter_thread.php " . $file)
}

closedir($dh);

Теперь очередь успевает обработаться за минуту, в отчётах всегда актуальные данные, но встала проблема с хостингом. Хостер активно урезает проекту CPU, так что следующим шагом будет переход на VPS или хотя бы отселение на отдельный аккаунт (сейчас рядом с iNternets'ами проживает достаточно прожорливый новостной сайт, о котором я, может быть, расскажу в следующих постах).

12 сентября 2010, 8:59
2661

Загрузка...
Loading...

Комментарии

только сейчас увидел эту запись. а когда вы использовали SQLite, разве вы не сталкнулись с такой проблемой как lock файла базы данных при обращении к одной и той же базе из нескольких потоков? И не совсем понятно для чего был нужен этот шаг? Разве ни проще было напрямую вставлять в MySql в какой либо queue table, где можно было создать колонку thread_id со значениями [1-10]. И далее так же обрабатывать эти записи используя cron и уже заполнять таблицы с окончательными отчётами. Так же я предложил бы использовать что то вроде Redis или MongoDB, но это только если есть VPS.
Проблем с локами пока не возникало. SQLite работает значительно быстрее MySQL на моём хостинге. Очередь в MySQL была промежуточным шагом, скрипт отвечал через 800-900 мсек, что на мой взгляд неприлично много. Redis и MongoDB я бы использовал с радостью, но всё упирается shared-хостинг :)
Да, почему вероятность локов довольно низка. Имя базы формируется как time()%10. Вероятность того, что в одну секунду в один файл попытаются писать два счётчика достаточно низка. Если же всё-таки локи возникнут я заменю имя файла на rand(0, 10) - вероятность станет ещё ниже. Потоки, обрабатывающие очередь, в общем-то, в основном читают из файлов, что, согласно документации, файлы не лочит.
да, я имел в виду именно запись в SQLite.
800-900ms это конечно медленно :(

Оставьте свой комментарий

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

Также можно нажать Ctrl+Enter

Популярные посты

Почему я больше не поеду отдыхать на северное побережье Алаколя

Почему я больше не поеду отдыхать на северное побережье Алаколя

Нам казалось, что на Алаколе мы сможем хорошо отдохнуть, расслабиться и набраться сил на весь следующий год. Вроде, и достаточно бюджетно, и не так далеко.
RisKaS
26 июня 2017 / 18:05
  • 8137
  • 38
ЭКСПО-2017. Каким бы правдоподобным ни казался обман, он всё равно раскроется

ЭКСПО-2017. Каким бы правдоподобным ни казался обман, он всё равно раскроется

Изначально про ЭКСПО было очень много слухов. Лишь только усаживаясь в поезд «тальго» до Астаны, мы уже были изрядно загружены этими слухами. Кто их запускал, для чего – отдельный вопрос..
openqazaqstan
27 июня 2017 / 15:45
  • 7423
  • 41
Эксперимент. Два парня и девушка в поисках лучшего донера в Астане

Эксперимент. Два парня и девушка в поисках лучшего донера в Астане

Нас трое: девушка и двое парней. Мы обошли 7 заведений, где продают донеры. Оценивали по 10-бальной шкале только по вкусовым качествам донера. Никто нам за рекламу не платил, бесплатными донерами не кормил!
nargiz_15
27 июня 2017 / 10:08
  • 6472
  • 15
На каких улицах города Алматы вы точно попадете в «пробку»

На каких улицах города Алматы вы точно попадете в «пробку»

Строятся пешеходные и велосипедные дорожки, трамвайные пути "сносят", а главная традиция нашего мегаполиса - замена подземных коммуникаций и в этом году не была нарушена.
beoblod
26 июня 2017 / 17:22
  • 4190
  • 3
Где отлично провести летние месяцы с пользой для здоровья и кошелька?

Где отлично провести летние месяцы с пользой для здоровья и кошелька?

Я обратил внимание, что в случае с уникальными природными зонами Павлодарской области применима поговорка: «что имеем – не ценим», а ведь они легко могли бы стать международными курортами.
Muzalevskiy
23 июня 2017 / 22:57
  • 3620
  • 11
Это «колхозное сооружение» вредит имиджу города. Я, как алматинка, против!

Это «колхозное сооружение» вредит имиджу города. Я, как алматинка, против!

Почему эту трубу не проложили под землей? Она обезображивает улицу, как дикий багровый шрам от раны, зашитой равнодушным, криворуким и ленивым хирургом, обезображивает лицо.
ValentinaVladimirska
23 июня 2017 / 12:10
  • 2917
  • 45
На Иссык-Куль через Юг. Не бойтесь ехать в Киргизию своим ходом!

На Иссык-Куль через Юг. Не бойтесь ехать в Киргизию своим ходом!

Очень живописная и бюджетная поездка вдоль всего берега по Иссык-Кулю! Мы, две обаятельные девушки, поехали вдвоем, подготовленные к совершенно автономной жизни в палатке, и ни разу ничего не...
yelenasergiyenko
22 июня 2017 / 13:20
  • 3131
  • 23
Неравенство в Казахстане – доходы самых богатых граждан в 6 раз больше заработка бедных

Неравенство в Казахстане – доходы самых богатых граждан в 6 раз больше заработка бедных

Почти 46% расходов казахстанцев уходит на продукты. При этом бедные казахстанцы стали есть меньше, богатые - больше. Инфографика
ZonaKZ
25 июня 2017 / 9:06
  • 2571
  • 23
Когда быть дома к ужину – роскошь. 10 признаков госслужащего в Казахстане

Когда быть дома к ужину – роскошь. 10 признаков госслужащего в Казахстане

Изучив и опросив своих друзей и знакомых, трудящихся во благо будущего нашей страны, представляю вашему вниманию явные признаки «слуги народа».
ArenMir
27 июня 2017 / 16:03
  • 2080
  • 17