Formdaki web sitesi erişim verileri session_id, ip, user_agent
ve isteğe bağlı olarak zaman damgası verildiğinde, aşağıdaki koşulları izleyerek, oturumları benzersiz ziyaretçilere en iyi nasıl kümeleyebilirsiniz?
session_id
: her yeni ziyaretçiye verilen bir kimliktir. Süresi dolmaz, ancak kullanıcı çerezleri kabul etmez / çerezleri temizler / tarayıcıyı değiştirir / cihazı değiştirirse, artık tanınmayacak
IP
farklı kullanıcılar arasında paylaşılabilir (Ücretsiz bir wi-fi cafe veya ISS'nizi yeniden atanan IP'leri hayal edin) ve genellikle ev ve iş için en az 2 tane olacaktır.
User_agent
tarayıcı + OS sürümüdür, cihazlar arasında ayrım yapılmasına olanak tanır. Örneğin, bir kullanıcının hem telefon hem de dizüstü bilgisayar kullanması muhtemeldir, ancak windows + apple dizüstü bilgisayar kullanması pek olası değildir. Aynı oturum kimliğinin birden fazla kullanıcısı olması olası değildir.
Veriler burada keman gibi görünebilir: http://sqlfiddle.com/#!2/c4de40/1
Tabii ki varsayımlardan bahsediyoruz, ama bu gerçeğe olabildiğince yaklaşmakla ilgili. Örneğin, farklı bir session_id ile sınırlı bir zaman aralığında aynı ip ve useragent ile karşılaşırsak, bazı son durum istisnaları ile aynı kullanıcı olduğu makul bir varsayım olacaktır.
Düzenleme: Sorunun çözüldüğü dil irellevant, çoğunlukla mantık ve uygulama değil. Sahte kod iyi.
Düzenleme: kemanın yavaş doğası nedeniyle, alternatif olarak mysql okuyabilir / çalıştırabilirsiniz:
select session_id, floor(rand()*256*256*256*256) as ip_num , floor(rand()*1000) as user_agent_id
from
(select 1+a.nr+10*b.nr as session_id, ceil(rand()*3) as nr
from
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)a
join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)b
order by 1
)d
inner join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 )e
on d.nr>=e.nr