Otomatik-yönlendirme-giriş sayfasında benim yöntemi PHP doğru mudur?

9 Cevap php

Bir kullanıcı birçok arkadaş olabilir bir topluluk sitesi var. Onun tüm arkadaşlarına görüntülerken, ben onun arkadaşı çevrimiçi veya çevrimdışı olup olmadığını eklemek istiyorum.

Kullanıcı "online" statüsü sütununda, bir oturum oluşturmak ve kullanıcılar tablosunu güncelleştirmek, açtığında Benim yöntemdir. O çıkış düğmesine tıklarsanız, sonra ben "çevrimdışı" için durumunu ayarlamak olacaktır. Ya o çıkış butonuna tıklayarak olmadan onun tarayıcıyı kapatmak? İşte yapmak istediğim şey:

session_start();
if (!isset($_SESSION['LAST_ACTIVITY'])) {
    // initiate value
    $_SESSION['LAST_ACTIVITY'] = time();
}
if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) {
    // last activity is more than 10 minutes ago
    session_destroy();
    //direct to a php, say this user is idle and thus status = offline
    header("location: update_status.php?user=".$_SESSION['username']."&status=offline");
    // den redirect them to login page
} else {
    // update last activity timestamp
    $_SESSION['LAST_ACTIVITY'] = time();
}

Bu uygun bir yolu var mı?


EDIT:

Bir kullanıcı bir sayfayı ziyaret ettiğinde bir kullanıcı online ve güncelleme olduğunda nasıl kontrol ile bazı kolay örnek kodu görmek için yararlı olacaktır?

Her link php?user=$_SESSION['userid'] eklemek gerekir mi?

9 Cevap

Bir kullanıcı sadece online / offline sütuna göre, çıkış yapmış olup olmadığını belirlemek Peki eğer - o zaman (sizin çıkış bağlantı / düğmesine isabet olmadan) kendi tarayıcı penceresini kapatmadan kullanıcılar hala oturum olacak

Burada normal bir yaklaşım, bir sayfaya gittiniz ne zaman son kez depolanması, kullanıcıların sitenizde gezinirken takip etmektir. Sonra kılan önceden tanımlanmış sabit ayarlanmış bir kullanıcı aktif (diyelim son 15 dakika içinde sayfanızın etrafında seyreden) - ve sonra ziyaret kişinin bir arkadaşı olduğunu ve olmuştur her kullanıcı kapmak için SQL Query bu kullanın son 15 dakika içinde bir site.

Eğer datetime (bu MySQL için bir sorgu) gibi zaman depolamak, bir SQL sorgusu böyle bir şey olabilir:

SELECT col1, col2, col3 FROM Users WHERE DATE_ADD(LastActive, INTERVAL 15 MINUTE) > NOW() AND UserIsFriendOfCurrentUser

Tabii ki sorgu daha iyi kurulum uyacak şekilde adapte gerekir, ama umarım anladınız.

Bence bu işe yaramaz. Kullanıcı tarayıcı kapandığında, buraya koymak kod denilen asla.

Olası bir yolu kullanıcı bir sayfa çağıran her kullanıcı veritabanında etkin olduğu son zaman kazanmak olacaktır. Kullanıcılar son Aktivitesi 5 dakika önce söylemek daha uzun olsaydı, siz çevrimdışı olarak onu saymak, ve diğer Kullanıcılara bu gösterebilirim.

Ben phpbb3 bu şekilde yapar düşünüyorum ...

Kullanıcı tarayıcı kapandığında bir olay alma ağır olduğunu ve her zaman çalışmıyor.

Başlık konumu yönlendirme sonra, kesinlikle bu satırı koyun:

die();

Tüm kullanıcı arayüzleri (tarayıcılar, web örümcekler, vb) yönlendirme başlığının dinleyecek değil. Senaryoyu Killing onlar sayfanın kalanını alamadım emin olmak için tek güvenli yoldur.

Bildiğim kadarıyla anladığım kadarıyla çözüm hala kullanıcı sitede oldu son kez daha sonra 10 dakika önce bile çevrimiçi olarak işaretlenmiş kullanıcı.

Sen, kendi veritabanında bir kullanıcı sitenizde aktif olan son kez kaydetmeniz gerekir. Bir kullanıcı arkadaş listesinde o görünüyor zaman da bu zaman alır ve bu daha sonra 10 dakika önce, arkadaşı inaktif yani olup olmadığına bakmak.

Bunu yapmanın en iyi yolu, kullanıcılar giriş için etkinlik kez saklamaktır. Onlar bir sayfaya gitmek veya bir eylemi gerçekleştirdiğinizde, şimdiki zaman ile veritabanındaki "son etkinlik" zaman güncelleyin. Bu sefer bir eşik (diyelim ki, 15 dakika) dışında düşerse, o zaman sınıf artık aktif olarak kullanıcıyı yapabilirsiniz.

Projemizde bu tekniği kullanın:

  1. giriş yaptıktan sonra her kullanıcı oturum kimliği ile ilişkili ediliyor.
  2. tarayıcı zamanlayıcı tarafından AJAX ile bir "etkinlik-isteği" gönderir.
  3. a lightweight server-side script updates last activity in DB, searching user by session id.
  4. cronjob updates all timed-out users, marking them as offline (actually session id gets empty), and executes logout routines for every user to avoid corrupted data on business-level layer.

What happens to user? Until user closes his browser - activity is being updated. After closing the browser user gets timed out and marked as offline. When user tries to reach any location which requires authorization - the first thing we try to do is to find him in DB by session id, and if not - he just can see nothing but login form (i.e. include(); exit();).

Kötü bir şey - sekmeli tarayıcılar aynı pencerede, açılan her sekme için aynı oturum kimliği kullanın. Ama proje, bir tarayıcı, bir oyun ve çoklu kullanıcı izin verilmemektedir. Aslında 2 veya daha fazla kullanıcı bir tarayıcı farklı sekmelerden giriş çalışın nereye çok nadir bir durum ...

Ben senin kod sorunları bir çift görmek:

if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) {
  // last activity is more than 10 minutes ago
  session_destroy();
  //direct to a php, say this user is idle and thus status = offline
  header("location: update_status.php?user=".$_SESSION['username']."&status=offline");
}

Bu kod parçası size oturumu yok ve then sadece tahrip oturumdan adını almak.

Ben sorunuzu anlamak arada, bu kod ile istenilen davranışı alamadım.

Kullanıcı sadece sitenizin (başlamadan oturumun sahibi) doğruysa, sadece şimdi sitede yeniden girmeniz çalışır onu kesmek, en fazla 10 dakika boşta biçimi olmuştur ve erişim olup olmadığını kontrol edin.

Sen $_SESSION son etkinlik saati depolamak için kullanmamalısınız. Bir kullanıcı bir sayfaya gider her zaman, last_activity kullanıcıların tablodaki şimdiki zaman ile adında bir sütunu güncelleştirmek:

<?php
session_start();

$userId = (int)$_SESSION['user']; // make sure it's an integer
$db->exec('
    UPDATE users 
    SET last_activity = NOW() 
    WHERE id = ' . $_SESSION['id']
);
//...

Arkadaş listenizi aldığınızda, eklemek bir online (bu MySQL sürümü) ise ifadesi kontrol eğer:

SELECT 
    u.user_name, u.name, etc,
    IF(
        UNIX_TIMESTAMP() - UNIX_TIMESTAMP(u.last_activity) < 300, 
        1, 0
    ) as online
    ...

300 saniye yani 5 dakikadır. Uygun gördüğünüz gibi bu ayarlayın. Sonra arkadaş böylece gibi erişilebilir:

$friends = $db->query(/* above SQL */);
foreach($friends as $friend)
{
    if($friend['online'] == 1)
        // online specific stuff
    else
        // offline specific stuff
}

Veritabanı oturumları çevrimiçi olup kim yönetmek için iyi bir yol olabilir. Teorik olarak kendi tarihinde sona gerekir. Ben bu konuda blogumda nasıl yazdı, sen http://brennydoogles.wordpress.com/2011/09/06/taking-control-of-your-php-sessions-using-database-sessions/ daha fazla okuyabilirsiniz

Bu aynı zamanda :) gerekirse uzaktan bir kullanıcı oturumunu öldürmek için izin avantaj vardır