v2.5.2
Giriş yap

Php ile online offline kontrolü nasıl yapılır?

deadmonster
1,129 defa görüntülendi ve 4 kişi tarafından değerlendirildi

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?

Cevap yaz
Cevaplar (12)
database
1035 gün önce

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.

mek
1036 gün önce

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>';
	        
	}
makifgokce
1036 gün önce

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.

reqres
1036 gün önce

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.

erkamalper
1037 gün önce

Bu sayfayı inceleyebilirsin.

dinar
1037 gün önce

ajax falan dinleme çünkü gereksiz.

2 yöntem söylüyorum sana uygun olanı kullan.

  1. 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.
  2. socket.io kullanabilirsin.
    kullanıcı giriş yaptığında socket.id alır backend'e gönderirsin. tablo yapısı işe şöyle;

    1. id (primaryKey)
    2. socketID (varchar)
    3. 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.

kemalgundogdu
1037 gün önce

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.

themonster
1037 gün önce

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

edward
1038 gün önce

Merhaba,
önerim kisinin hareketsiz geçen süresini kontrol ettirerek offline konumuna gecisini yaptirabilirsin veya nodejs'i arastirabilirsin

fatihozpolat
1038 gün önce

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.

rephp7
1038 gün önce

Sanırım timeout ayarlamak lazım, kullanıcı çıkış yapmasa da belli bir süre sonra otomatik çıkışını sağlayarak ancak çevrimdışı kontrolü yapılabilir diye düşünüyorum.

mami
1038 gün önce

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 😊