Web siteleri için etkili bir isabet sayacı yazmak nasıl

9 Cevap php

Ben bir web sitesi ve menşeli IP'lere görüntülerde hit takip etmek için bir hit counter script yazmak istiyorum. Gösterimler günde yüzbinlerce yukarı, bu nedenle sayaçlar birçok kez bir saniye artar.

Ben basit, kendini barındırılan yöntemi (php, python scriptler, vb) arıyorum. Bu izlemek için MySQL kullanarak düşünüyordum, ama daha verimli bir yolu var tahmin ediyorum. Sayaçları tutmak iyi yöntemleri nelerdir?

9 Cevap

Büyüleyici bir konu. Bu olabilir gibi basit bir sayaç, artırım sadece has mantıklı daha uzun süre boyunca bütün DB lokavt, bir işlem ... anlam olmak için -!) Kolayca için tıkanıklık olabilir Bütün sistemi.

Titizlikle tam sayıları gerekir ama anında up-to-date olmak için onlara ihtiyacımız yoksa, benim favori yaklaşım (veri tazelik amaçlar için gerekli sıklıkta günlükleri anahtarlama) bir günlüğüne sayılabilir bilgi eklemek için olduğunu. Bir günlük (içinde sayılabilir olayları binlerce) kapalı sonra, bir komut dosyası okumak ve tüm bu tek bir işlemle ihtiyaç duyulan güncelleyebilirsiniz - belki sezgisel değil, ama tek kilitleri binlerce çok daha hızlı.

Sonra sadece statistically doğru son derece hızlı sayaçları - ama böyle belirsizlik kabul edilebilir olduğunu söylemek değil, çünkü ben daha derinlemesine bunları açıklamak için gitmiyorum.

Eğer web sunucusu Access log alabilir: Birisi ziyaret zaman zaman içinde tam şu anda eldeki veri olması gerekmez durumda (cronjob) tekrar (Apache access.log) ve o zaman değerlendirmek ve sizin bir site.

Genellikle, access.log zaten üretilen ve istenen kaynak hem de zaman, tarih ve kullanıcının IP içerir. Bu şekilde bir php-script yoluyla rota tüm Alt gerekmez. Yalın, sayma makine anlamına gelir.

Iki gerçekten kolay yolu vardır:

  1. Toplu web günlükleri üzerinden ayrıştırmak.
  2. beanstalkd veya gearmand ile hit çalıştırın ve bir işçi kontrollü bir şekilde zor şeyler var.

Opsiyon off-the-raf araçları ile 1 çalışır. Seçenek 2 programlama sadece biraz gerektirir, ancak trafik sivri (sizin gibi doğrudan mysql durumunda bulacaksınız) zaman devrilmesine neden olmadan gerçek zamanlı güncellemeleri daha yakın bir şey verir.

Şüphesiz, Redis bu sorun için idealdir. Bu kurulum için yaklaşık bir dakika gerektirir ve yüklemek, atom artışlarını destekler inanılmaz hızlı, müşteri python ve php için kütüphanelerini (ve diğer birçok dilde), dayanıklı (anlık, dergi, çoğaltma) 'dir.

Kendi anahtarı her sayacı saklayın. Sonra sadece

INCR key

Doğruluğu önemli ise, size sayaç değerlerini depolamak için bir HEAP / Bellek tablo oluşturmak ... MySQL ile biraz daha yavaş yapabilirsiniz. Cayır cayır yanan hızlı olan bu bir bellek tablolar. Sen aralıklarla normal bir tabloya veri yazabilir.

App motor fikirlerine dayanan, sizin sayaç için geçici bir mağaza olarak memcache kullanabilirsiniz. Bir memcache sayacı artırma (Bence) MySQL yığın tabloları kullanarak daha hızlıdır. Her beş veya on saniye sonra, memcache sayacı okuyabilir ve DB içine numarasını yazın.

Emin değilim bu sokak kalmış, ama AppEngine üzerine inşa etmek oldukça güzel bir platform olmadığını. Onların Datastore ve işlemlerini kullanarak bir sayaç oluşturmak için kullanabileceğiniz bazı örnek kod burada açıklanmıştır: http://code.google.com/appengine/docs/python/datastore/transactions.html.

Sen kullanabilirsiniz Redis - bu s atom artışlarla desteği ile çok hızlı anahtar-değer depolama `. Ihtiyaç ortaya çıkacak olursa - sayımları verileri kolayca birden çok sunucu arasında parçalı olabilir.

Ben (birden çok sunucu, etki, saatte birkaç bin isabet yüzlerce) ve dosya log analiz kesinlikle gitmek için yolu oldu benzer bir ölçekte, çok benzer bir şey yaptık. (Ayrıca, dosya türüne göre bunları ağırlıklı vurmak oranları, kontrol, ve onlar çok fazla istek yapıyor eğer güvenlik duvarı IP adreslerini kara listeye; Amaçlanan sadece karşı olmak için değil, oto-blok kötü botlar, ama sayma bir oldu Bunun önemli parçası.)

Web sunucusu sürecinin kendisi üzerinde hiçbir performans etkisi, orada herhangi bir ek işi değil ve kolayca kilit gerek kalmadan her dakika / 5 dakika/100 vurur / ne olursa olsun sitenin veritabanına içine enjekte edilerek düzenli aralıklarla güncellenen hit sayılarını yayınlamak olabilir beri Her vuruşta, ilgili satır / tablo / veritabanı (kullanım kilitleme mekanizmasına bağlı olarak).

Eğer bir SQLite veritabanını kullanabilirsiniz PHP yol gitmek ne varsa iyi, ancak MySQL bu bilgi ve genellikle (gördüğüm olanlardan en az) ne kadar saklamak için mükemmel makul bir yoldur yapılır.

If you didn't want to store IP address and any other info a simple number in a text file could work.