2012-03-25 49 views
2

我已經開發了PHP中的許多登錄系統。基本上,對於我創建的每個網站或應用程序,它都有一個登錄方案來創建文章,上傳圖片,編輯評論e blablabla。什麼是最好的:檢查數據庫或只檢查每個頁面上的會話使用PHP

我從來沒有遇到過這個問題,除了一次當我在我的網站內創建一種社交頁面。有用戶打擾其他用戶,所以我決定刪除他的個人資料,這就是爲什麼我在這裏要求你的幫助。

當時,我只是檢查每個頁面上的會話,例如:

<?php 
if($_SESSION['loggedin'] === true) 
{ 
    // Keep that page 
} 
else 
{ 
    // redirect to login page 
} 
?> 

然後,當我刪除他的個人資料的會議還沒有關閉,在此之後,用戶繼續煩人其他用戶,我無法做任何事情。

那麼,什麼是處理每一頁上的會話中最常見的和最好的辦法:檢查數據庫中的每個時間或只是檢查是否會是真的嗎?

+0

你應該加入一個的.htaccess重寫規則與存在的IP地址將其轉發給您的註銷頁面,simpleszzz – 2012-03-25 13:40:47

回答

4

我不知道什麼是最好的方式,但我做這樣的事情:

我與會話SQL表(例如用戶ID,會話ID,EXPIREDATE,...)。

SessionID的是在$ _SESSION [ 'cms_session'] 「保存」。

如果這是在$ _SESSION的會話ID [「cms_session」]不會在會話表中,用戶不會在loged了。

刪除表中的舊會話我使用crons。

0

每次頁面加載時檢查數據庫確實是低效的。如果你所要做的只是殺掉他的會話,你應該將會話存儲在memcached中,其中「key」基於用戶名,例如「johnsmith-session」,然後在管理頁面上發送消息到memcached以殺死該密鑰,該密鑰應立即將其註銷到您的網站外。

如果PHP當前正在將會話數據寫入磁盤,則取決於數據如何被序列化,您可能能夠在磁盤上跟蹤其會話文件並刪除該文件,這將完成同樣的事情:下次用戶嘗試加載新頁面,他的會話將無效,他將被要求重新登錄。

請記住,真正持久麻煩的用戶往往會重新註冊一個新帳號繼續滑稽動作,所以你要留意從個人新註冊的其他手段。

+0

我會看看現在......後來我就告訴你。 – Foreba 2012-03-25 13:50:52

1

你正在嘗試做的是有一個地方,你可以維護用戶狀態,並知道變化會立即反映。

檢查數據庫中的「user_status」字段對每個請求都是非常有效的調用。這提供了一個單一的地方,您知道如果您停用用戶,這些更改將反映在他們的下一個請求上。您還可以輕鬆地完成此操作,而無需編寫另一套例程查看會話變量,或創建某種消息系統,其中應用程序宣佈用戶已被停用。

+0

是的,其實我現在正在使用這種方法,我只想知道其他開發人員是否同意我的看法。謝謝 – Foreba 2012-03-25 13:48:05

+0

對於小型網站來說,這將會很有效,但是如果您打算擴展「大量」用戶(而「大型」則由您的服務器/集羣的容量來定義),您只需轉到基於內存的解決方案,如memcache。 Brian的方法實際上與我們在Armor Games中做的非常相似,我們在Memcache中存儲了所有會話數據以及用戶的「活動」標誌。用memcache_get($ memcache_obj,array($ key1,$ key2,$ key3等))調用查詢多個密鑰的memcache對於我們來說非常高效。 – iandouglas 2012-03-25 14:11:55

+0

@iandouglas - 我同意你的一個大型網站,但這爲系統增加了很多複雜的小型或中等規模的網站。 – 2012-03-25 14:15:23