kullanıcı ne zaman oturum zaman aşımına dışarı oturum php gözlemci desen

5 Cevap php

I'm trying to log users out when the user's session timeout happens. Logging users out - in my case - requires modifying the user's "online" status in a database.
I was thinking that I might be able to use the observer pattern to make something that would monitor the state of the user session and trigger a callback when the session expires - which would preserve the user's name so we can update the db. I'm not exactly sure where to begin on the session side. Can I tie a callback to the session's timeout?

bunlar herhangi bir kullanılabilir armut veya zend oturum paketleri içine inşa edilir? Ben bu gerçekleşmesi için gereken neyse kullanacağız!



UPDATE @ 16:33:
What if you have a system where users can interact with each other (but they can only interact with online users)? The user needs to know which other users are online currently.

Biz sadece oturumu her sayfa yenilendiğinde hala hayatta olup olmadığını görmek için kontrol ederseniz, daha sonra bir zaman aşımından sonra, kullanıcı bir sayfa olmayan açmış gönderilir, ama yine de sistemden online olarak listelenir.

Bu yöntemi biz oturum zaman aşımı zaman, biz onları oturum açmak için kullanılan olabilir kullanıcı hakkında bilgi kaybetmek dışında iyi olurdu.



UPDATE @16:56:
right. Thanks. I agree...sort of ugly. I already have some slow polling of the server happening, so it would be quite easy to implement that method. It just seems like such a useful feature for a session handling package. Zend and PEAR both have session packages.

5 Cevap

İlk basit örneği. Eğer sisteminizde 1 kullanıcı var ve zaman aşımı için oturuma istediğinizi varsayalım, ve statüleri doğru raporlama istiyorum. Kullanıcı 12 dakikada bir sayfaya olmamıştır, ve oturum zaman aşımı 10 dakikaya ayarlanmıştır. Iki şeyden biri olacak. Onlar kısa bir süre sonra tekrar ziyaret edecek, ya da olmaz ya. Tekrar ziyaret etmezseniz, nasıl sistem, bugüne kadar onların zaman aşımı durumunu güncelleştirmek için kod çalıştırabilir olacak? Tek yolu * ayrı bir süreç "oturumda" statüsünde bulunuyor, tüm kullanıcılar için durum güncelleme fonksiyonu başlatmak sahip olmaktır.

Bir kullanıcı, sitenizi vurur her zaman, son erişilen zaman kendi oturumu ilgilidir veritabanındaki bir değişkeni güncelleştirmek. Sonra her dakika çalışan bir cron işi oluşturun. Bu oturum durumları kontrol etmek için basit bir işlevi çağırır. "Zaman aşımına uğradı" zaman aşımı süresinden daha eski herhangi oturumları statüsüne alınır. (Ayrıca, sonra oturumları bir süre oturdu zaman aşımına tabloyu temizlemek gerekir). Hiç isterseniz insanların sayısı hakkında bir rapor daha sonra timeout başlangıç ​​daha son erişilen zaman tüm kayıtları, sorgu kaydedilir.

"*" Başka yolları vardır, ancak basit bir web uygulamasının amaçları için, bu gerçekten gerekli değil. Basit bir web uygulaması daha karmaşık bir şey varsa, özel ihtiyacını yansıtacak şekilde sorunuzu güncelleyin.

Bir kullanıcı bir sayfa vurur zaman, veritabanında o zaman işaretlemek, bu sütunu LastAccessed diyoruz. Kullanıcı sitenizin Çıkış kısmına tıkladığında, null bu değeri ayarlayabilirsiniz. Şu an giriş kullanıcıların bir listesini bulmak için sorgu yazarken, aşağıdakileri yapın:

SELECT *  FROM Users WHERE LoggedIn=1 AND LastAccess > DATEADD(Minute,-20.GETDATE())

Hala etkin bir oturumu olan kullanıcıları dönecekti Hangi. Muhtemelen MySQL / PHP ile çalışmıyor SQL Pardon, ama bu size genel bir fikir vermelidir.

Neden bunu yapmak istiyorsun? Ortak bir yaklaşım zaman aşımı süresi doldu eğer kullanıcı tarafından gönderilen her isteği kontrol etmektir. Tabii ki zaman aşımı ulaşıldı olsa bile, oturum açmış gibi kullanıcı hala gösterilir çünkü db de durum, güncel olmadığı anlamına gelir.

Ama pratik amaçlar için genellikle fark etmez.

Çirkin ama belki uygulanabilir bir öneri:

Sayfalara uyumsuz bir canlı tutma istekte ekleyin, bu onların son-aktif damgası günceller. Daha sonra onlar daha 20 saniye yaşında bir son-aktif damgası varsa çevrimdışı olarak kullanıcılara işaretler bir cron işi olabilir. Her dakika çalıştırmak için cron işi ayarlama hile yapardı. Ben orada bir kullanıcının oturum zaman aşımı ne bir şey tetiklemek için bir yol var, ya da tarayıcıyı kapatır emin değilim.

Benim ilk düşünce, etkin bir oturuma sahip olarak oturum açmaktan yorumlayan bir özel oturum işleyicisi oluşturabilirsiniz olmasıdır.

Bir özel oturum işleyicisi http://www.daniweb.com/code/snippet43.html görmek ve PHP doc okumak oluşturma konusunda bazı örnekler için http://ca.php.net/manual/en/function.session-set-save-handler.php