Php ile online offline kontrolü nasıl yapılır?
Php'de online offline kontrolü nasıl yapılır?
çoğu yazıda okuduğum (saçma bence) üye giriş yaparsa online = 1 yap çıkış yaparsa online = 0 yap.
Bu yöntemle olmaz, malum ki kimse kendi bilgisyarında çıkış yapmakla uğraşmaz, direk browserı kapatır. Bu durumda da jquery kullanarak bunu yapabileceğimi okudum ama nasıl yapıldığını anlatmamış. Sizce bunun yöntemi böyle mi olur yoksa unixtime kullanarak mı? Eğer unixtime ise mantığı nedir?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (12)
Bu aslında şöyle baktığımız zaman düz php ile çok sınırlı yapılabilinecek bir şey fakat imkansız değil tabi benim eskiden bu konuda kullandığım bir yöntem vardı o yöntem de 5 saniyede bir url ye istek atıp kişinin users tabosundaki 'online' sütununu o anki timestamp (+5 ekleyerek) ile değiştirip timestampın time() den büyük mü değil mi kontrolünü atıyordum eğer büyükse online oluyordu zaten kişi siteden çıktığında urlye istek atamayacağı için de 5 saniye içinde offlineye düşüyordu.
Hocam bir süredir ben de bu konu hakkında çalışıyordum. Az önce tamamlayabildim. Hala test ediyorum, yaptığım sistem çok amatör bi o kadar da basit bir sistem daha gelişmişleri nodejs ile yapılabilir fakat böyle de çalışıyor. Zaman damgasıyla kullanıcı var mı yok mu varsa nasıl çevrimiçi tutabiliriz onu paylaşıyorum. Elimden geldiği kadar yapabildim. Sanada yardımcı olabilmek için kodlarımı paylaşıyorum.
Veritabanında user tablona "online" adında bir sütun oluştur. Daha sonra;
Kullanıcıyı sayfayı yenilediğinde oturum süresini uzatmak için bu kodları Header.php'ye kendine göre düzenledikten sonra yapıştır.
Kullanıcı adını ve Online durumunu istersen SESSION'a atayabilirsin. Ben henüz deneme/yanılma aşamasında olduğum için bir çok yeri düzenlemeden bıraktım. Henüz çakışmıyor bir hata ile karşılaşmadım. Karşılaşırsam haber veririm.
$username=$_SESSION['username'];
$_SESSION['online'];
$online=strtotime($_SESSION['online']);
$suan=time();
$fark=($suan-$online);
if ($fark>600) {
$zamanguncelle=$db->prepare("UPDATE user SET
online=:online
WHERE username='$username'");
$update=$zamanguncelle->execute(array(
'online' => date("Y-m-d H:i:s")
));
$_SESSION['online']=strtotime(date("Y-m-d H:i:s"));
}
Daha sonra kullanıcı login olduktan sonra ilk çevrimiçi kullanıcı olayını başlatmak için kullanıcıyı login ettiğin formun post olduğu sayfaya bu konu yapıştır.
$zamanguncelle=$db->prepare("UPDATE user SET
online=:online
WHERE username='$username'");
$update=$zamanguncelle->execute(array(
'online' => date("Y-m-d H:i:s")
));
$_SESSION['online']=strtotime(date("Y-m-d H:i:s"));
Son olarak çevirimiçi kullanıcıları listelemek için paylaştığım kodu kendine göre düzenleyip, kullan.
$ten_minutes_ago = time() - (60 * 10);
$datetime = date("Y-m-d H:i:s", $ten_minutes_ago);
$dm=$db->prepare("SELECT * FROM user WHERE online >= '$datetime'");
$dm->execute();
while($dups=$dm->fetch(PDO::FETCH_ASSOC)) {
echo $dups['username'];
echo '<br>';
}
https://github.com/dominicklee/PHP-MySQL-Sessions/blob/master/mysql.sessions.php
buradaki class biraz düzenlemeyle işine yarayabilir.
dbye kayıt ederken ek olarak user_id'sinide girersin.
Oturumlarda (session) bahsediyorsan en makul çözüm oturumlar için bir timeout süresi belirlemektir. session_regenerate_id kullanılarak da bir şeyler yapılabilir. Kullanıcının sekmeler bazında kullanıcıyı izlemek mümkün ancak tarayıcıyı kapattığını tespit etmenin bir yolu yok diye biliyorum.
ajax falan dinleme çünkü gereksiz.
2 yöntem söylüyorum sana uygun olanı kullan.
- bir middleware oluşturursun kullanıcı haraket ettiğinde cache oluşturursun 5 dakikalık. her harekette o cache 5 dakika güncellersin. 5 dakika bittiğinde kullanıcı hareket etmezse sitede zaten offline olmuştur demektir ki o zamanda cache silinecektir.
socket.io kullanabilirsin.
kullanıcı giriş yaptığında socket.id alır backend'e gönderirsin. tablo yapısı işe şöyle;- id (primaryKey)
- socketID (varchar)
- accountID (int)
kullanıcı giriş yaptığında socket id alır sessiondan'da kullanıcı id'yi alır kaydedersin
kullanıcı çıkış yaptığında socket.io tarafında backend'e socket.id gönderirsin
backend tarafında socket.id alır veritabanında sorgularsın
accountID çeker kullanıcının tabloda ki statusu offline olarak güncellersin :) veee bitti. tam dinamik online offline sistemi.
Benim bildiğim kadarıylada kullanıcının tarayıcıyı kapattığını anında öğrenemezsin. Durmadan istek atarsan öğrenebilirsin buda sunucuyu yorar. 5 dakikada bir sorgu göndererek online olup olmadığı anlaşılabilir.
daha farklı mantıklarda vardır tabi ama ben 2 farklı yol düşündüm
öncelikle javascript kodlarımız bu şekilde olsun
setInterval(function(){
$.get('ajax.php?type=keep_alive');
},60000 * 2); // 2 dakika
içerikte sadece o anki session,cookie tabloda last_activity_time ı güncellicek
update user set last_activity_time = now() where id = x
-1. yol kullanıcıları listediğin yerde o kullanıcı garanti olsun diye 5 dakikadan büyükse offlinedır
-2. ajaxda tablodaki status durumunu güncelledikten sonra bir cron yazıp 5 dakikadan büyük olanları 0 a çekebilirsin
ajax istekleri sürekli sürekli sekme değiştirmeyen bir insan için bilgisayarda performans kaybına neden olabilir
yine de en sağlıklı nodejs socket kullanman olur
En garantisi 1dk aralıklarla ajax vb. istek atıp son aktivite tarzı bir kolonu güncellemek olabilir.
Kullanıcının online/offline gösterileceği yerde de son aktivite 1dk dan önce ise online değilse offline yazacak.
Ama kötü tarafı sadece o an için alabileceksin online/offline durumunu yani 1dk dolsa ve adam terketse bile online görünecek
en güzeli socket.io gibi realtime bir şey yapmak sanırım.
Aslında Biraz Mantıklı Düşünürsek, Kullanıcı Sayfaya Giriş Yapmadığı Sürece Online Sayılmaz;
Browseri Kapatırsak Kod Çalıştırmamız İmkansız. Bu Nedenle Benim Düşüncem, Sayfa Her Çalıştığında
Koyacağımız Kod Sayesinde Kullanıcıyı Online Göstermek.
İyi Günler 😊