PHP online kaç kullanıcı bulmak?

4 Cevap php

Web siteme her ziyaret bir kullanıcının bireysel isabet sayacı günceller ve time() bir çerez saklanan kendi IP adresi ve kimliği dayalı bir sütun günceller. Çıktı verileri gelirken Peki, aslında başlı başına bir kopyası olarak, az veritabanı çağrıları ile benim aşağıdaki kod daha verimli bir yolu:

<?
$last1Min = time()-60;
$last5Mins = time()-300;
$last1Hr = time()-6000;
$last1Dy = time()-144000;
$last1Wk = time()-1008000;
$last1Mnth = time()-30240000;

//last1Min
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Min";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last minute: " . $rows['COUNT(*)'] . "<br />\n";
}

//last5Mins
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last5Mins";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last 5 minutes: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Hr
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Hr";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last hour: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Dy
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Dy";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last day: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Wk
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Wk";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last week: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Mnth
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Mnth";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last month: " . $rows['COUNT(*)'] . "<br /><br />\n";
}

Bu verileri sunma daha verimli bir yolu varsa, ben bu ölçümlerin her biri benim tüm sitede online için kaç kullanıcıları değil sadece göstermek için genişletmek isteyen, ama ben sitemde her sayfa için kayıt ve çıkış verileri .

4 Cevap

SELECT 
  SUM(lastOnline <= 60) AS one_minute,
  SUM(lastOnline <= 300) AS five_minutes,
  ...
  SUM(lastOnline <= 30240000) AS one_month
FROM usersonline

Bu yöntemi kullanarak, size tek bir tablo taraması ile tek sorguda gereken her şeyi alabilirsiniz; çok daha verimli olduğunu daha almaz. Diğerleri de söylediğim gibi, (hatta bu optimize edilmiş formda) nispeten pahalı olduğu gibi, sonucu önbelleğe gerekir. Her sayfa yük Bu hesaplamada hiçbir nokta (eğer, diyelim ki, digg ön sayfa isabet eğer son derece muhtemel olan) saniyede birden fazla hit görüyorsanız, özellikle var

lastOnline <= 60 koşul doğrudur ve koşul yanlış satırlar için 0 satırlar için 1 değerlendirir; SUM () size koşul doğru olduğu için satır sayısını sayısını vererek, bu 1'ler ve sıfır özetliyor.

Bir kaç yıl önce mysql dokümanlar bir kullanıcı açıklama bu tekniği öğrendim; similar examples elsewhere vardır

Her dakika / 5 dakika / vs sadece bir kez doğru değerleri hesaplayan bir cron işi kurmak. Sonucunu önbelleğe ve bunun yerine gösterilecek. İstatistik X kez ikinci bu türlü hesaplamak için gerçekten gerek yok onlar sadece bir kez bir dakika değiştirmek veya bir zamanlar hiç yarım saat zaman.

Onun yerine sadece son bir ay içinde herkes için bir arama yapmak ve tarihe göre bunları sipariş kez her veritabanı çağrı. Sonra php kullanıcı son oturum ne kadar uzun zaman önce görmek için tarih ve saati karşılaştırabilirsiniz

Eğer dosyalara oturumları kaydetmek, bir süre içinde erişilen dosyaların sayısını olabilir. Sonra hiç bir veritabanı erişim olurdu.