Nedir belirlemek için en kolay yolu online bir kullanıcı?

9 Cevap php

Ben kullanıcı çevrimiçi olduğunu bilmek oturumları domuz geri bir yolu var mı?

Yani: kullanım günlükleri, ben bir $ _SESSION değişkeni, kullanıcı zaman aşımına-çerez Çöp toplayıcı çevrimdışı olarak onların durumunu güncelleştirmek için veritabanını günceller ayarlayın.

EDIT: I kez tarihlerini veya içermeyen bir çözüm istiyorum. Ben oturumları veya benzeri bir şey üzerine binmek için bir şey istiyorum. Birisi çevrimiçi olup olmadığını tahmin ne ihtiyacım için yeterince iyi değil.

9 Cevap

Saat dilimleri arasındaki farklılıkları endam ile rahatsız etmeyin. Bu gerekli değil.

Kullanıcı bir sayfayı eriştiğinde, kullanıcılar tablonun kendi kayıtlarında son güncellenen-time bir alanı güncelleştirmek. Ardından son 5 dakika içinde son güncellenen-zaman sahip tüm kullanıcılar için bir sorgu yapmak. Bu başka bir şey, onlar kabul edilir "offline."

Eğer MySQL NOW () fonksiyonu aracılığıyla, sunucu zamanı kullanıyorsanız, yan adım olacak zaman dilimleri arasındaki farkların hesaplanması.

Bu birçok kullanıcı (dakika son birkaç içinde aktif, Anlamı) anda online nasıl izleme standart yoludur.

Constantly Updated

Eğer onlar bir sayfadan diğerine atlayarak olmasanız bile hala aktif olduğunu bilmek istiyorsanız, sunucu onlar hala hayatta olduğunu bildirmek için her 60 saniyede bir ya da ping javascript biraz bulunmaktadır. Bu benim özgün öneri olarak aynı şekilde çalışacağız, ama bu çılgınca en az bir kez her beş dakikada sitenizi gezen olmalarını gerektirmeden kayıtları güncellemek olacaktır.

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);

Eğer (temizlendikten sonra) için ne soruyorsun, tanımı gereği, mümkün değildir. HTTP bağlantısız bir protokoldür, yani en kısa sürede bir kullanıcı bir sayfa vurdu ve tüm içeriği geri kullanıcının tarayıcısına sunucudan geliyor gibi, ikisi arasında hiçbir bağlantı yoktur. Birisi bir saniyeden daha az için web sitesi ile "online" dir.

Eğer could yapılacak tek şey kullanıcı {[kullanarak, sayfa ayrıldığında tanımlayıcı bilgiler ve farklı bir AJAX isteği içeren bir düzenli olarak geri sunucuya AJAX isteklerini yapmak web sayfasında JavaScript sahip olmaktır (1)]}.

Sizin "online kişi" karşılaştırma mantığı dikkate timezones almayan gibi geliyor. Bu şekilde dilimleri ile uğraşan varsa, ben şiddetle GMT tüm kez saklamanızı öneririz, ve bunları görüntülemek hemen önce kullanıcılar için yerel zaman çevirebiliriz. Bu, herhangi bir karşılaştırma işlemleri çok basit hale getirecek.

Orada SO saat dilimleri hakkında iplik bir güzel here.

Sitem ve userbase tüm mysql DB, siteme bir kullanıcı giriş, olduğundan beri benim en iyi yoldur olmayabilir ama

  1. I update the user table to say they are online
  2. Çevrimiçi tabloya onları eklemek
  3. Then I set a session with the current time

5 dakika sonra eski ise o varsa ben, online zaman oturumu denetlemek her sayfa yük, ben az sonra 5 dakika eski ise o kadar eski görmek için kontrol, ben hiçbir şey, sonra ben güncelleştirmek Ayrıca şimdiki zaman ve tekrar oturum zaman zaman online kullanıcı tablosunu güncelleştirmek

Online tablodan herhangi kullanır siler ve orada çevrimiçi zamanı bir dakika X miktar içinde güncellenir eğer çevrimdışı olarak kullanıcı tablo var işaretleri - 15 dakika sonra ben her 10 çalışan bir cron işi var

Tabloda zaman dilimini Mağaza ve sayfayı görüntüleyen kullanıcı yerel saate göre, kullanıcıların yerel saati bulmak için bir hesaplamada kullanmak.

Edit:

Daha da iyisi, sadece sunucusu zaman göreceli tüm hesaplamaları sunucu saati gibi tüm süreleri depolamak ve taban.

Bu tabloya bir kullanıcının bir sayfayı yükler her zaman güncellemek / "ip" ve "son-updated-time" ve sorgu: "kimin-online" sütunları ile ayrı bir tablo oluşturmak için, durumunuza göre değişir, daha iyi olabilir.

On page load queries may include:

  1. "Kimin-online" masa geçerli kullanıcı için ip dayalı Güncelleme / insert.
  2. (Periyodik cronjob kullanılarak da yapılabilir) satırları "doldu" Delete.
  3. "Aktif" kullanıcıları saymak.

Benefits of using this technique:

  1. Bir kullanıcı giriş değilse, o / o hala paletli / sayılır ediliyor.
  2. Bu tablo daha hızlı olabilir sorgulayarak, sahip kullanıcıların miktarına bağlıdır.

Not: Bunu kullanmak Eğer herhangi bir sayfa gösterimi böylece botlar göz ardı ya da sadece popüler olanları (Firefox, IE, Safari, Opera, vb) güvenebilirsiniz Yönlendiren dayalı tabloda bir satır oluşturacaktır dikkate almak istesin.

Ben tavsiye ederim bir şey örneğin memcached veya mysql yığın veya Redis ile bellekte bu tür bilgileri saklamak için. Aksi takdirde veritabanı bir çok hit olacak çünkü.

Bunun için hayata geçirdik çözüm, kimliği doğrulanmış bir kullanıcı tarafından her sayfa yük, / set gibi "user_ {adınız} isonline" => true and expire it in 5 minutes. Then check if the var is in the cache when I access the user's info. Depending on the size of your user base, if you want to get a list of everyone online, you could use a memcache getmulti call with an array of "user {kimliği} _isonline" size tüm anahtarlar gibi bir memcache VAR sıfırlamak için kullanıcılar.

Tabii, bu gerçekten bir kullanıcı sitenizdeki sayfalarınızı değişecek ne sıklıkta bağlıdır ... çevrimiçi kullanıcıların daha doğru temsil almak için, küçük bir aralık (30 saniye ya da çalışan sayfanızda bir ajax xmlhttprequest çağrı uygulamak böylece) o memcache VAR sıfırlar ve memcache var az zamanda (mümkünse tarayıcı sorunları hesaba 1 dakika) içinde sona erecek var. Bu tamamen doğru değildir, ancak http sunucuya kalıcı bir bağlantı yok gibi, oldukça yapabileceğiniz ne sınırlıdır.

Online kim ikinci gösterimine kadar bir ihtiyaç IF, belki belirli bir kullanıcı sunucu üzerinde açtıysa bir jabber sunucusuna bağlanır sayfanızda yüklü bir flaş uygulaması, daha sonra sadece kontrol olabilir.

Eğer kullanıcı giriş veya hiç olup olmadığını gösterebilir yolu çıkış sorguda durumunu ve başka bir güncelleştirme sorgusu denilen mysql tabloda bir sütun güncellemek için giriş işlemci üzerinde bir güncelleştirme sorgusu kullanabilirsiniz