2011-06-18 35 views
3

我使用下面的代碼跟蹤了一個帶有img標籤的在線用戶會話。如何在PHP中終止用戶會話?

<img src="http://www.somedomain.com/track/login.php" alt="" title="" width="1" height="1" /> 

使用上面的代碼,我做了一個管理部分來顯示在線用戶。

現在,由於某種原因。我必須從管理部分結束在線用戶的會話。

任何人都可以幫我一個這個。

注:

在用戶頁面,用戶會話與

if(authenticated) { 
$_SESSION['username']=name; 
$_SESSION['id']=id; 
} 

回答

0

我會實現這個以下列方式:使用文件存儲會話,將這些文件存儲在具有讀/寫訪問權限的特定位置,爲其提供可預測的名稱(例如用戶名上的md5) - 以及何時結束會話一個用戶,只需刪除屬於該用戶的文件即可。

//get current logged in user user - this way we get it as a GET or POST parameter - NOT safe, because the user can modify this parameter - you could get it from the login form for example 
$current_user = md5($_REQUEST["user"]); 
// start user's sessions like this 
ini_set('session.save_handler', 'files'); 
//load the session of the current user 
$current_user = md5($_REQUEST["user"]); 
//set the current session id to the one corresponding to current user 
session_id($current_user); 
session_save_path("/tmp/sessions/"); 
session_start(); 

在您的管理部分,獲取用戶名作爲參數,計算它的MD5,然後刪除該用戶的會話:

$current_user = md5($_REQUEST["user"]); 
unlink("/tmp/sessions/$current_user"); 

此代碼可能無法開箱的爲你工作,但這是遵循的一種好方法

+0

該文件重新創建,如果用戶重新加載頁面,對不對? – Jagadeesan

+0

我修改了代碼 - 現在它設置了所需的會話ID - 它不會重新創建會話 –

+0

如果我使用會話文件,就像您說的那樣,如果用戶在不使用註銷的情況下關閉了瀏覽器,文件可能會被刪除? – Jagadeesan

1

處理使用的功能如下:

session_unset(); 
session_destroy(); 
+0

這破壞了當前用戶的會話 - 我認爲他想破壞其他用戶會話 –

+0

怎麼可以從管理部分完成.. – Jagadeesan

+0

@Tudor:是的,你說得對。 – Jagadeesan

0

您可能需要將數據推送給用戶。看看Comet技術和類似的替代品

0

我不認爲有一個簡單的答案,你正在嘗試做什麼。

由於都鐸說你可以刪除存儲在特定目錄中的會話文件(一個目錄,你可以動態設置,就像他在他的例子中那樣) - 看他的例子。

另一種方式是編寫自己的會話處理類(請參閱PHP手冊中的示例 - http://php.net/manual/en/session.customhandler.php),並將會話數據存儲在文件和/或數據庫中。換句話說,使用你的自定義會話處理程序,我認爲你的任務會更容易。

+0

,如果用戶在不使用註銷的情況下關閉了瀏覽器,該如何刪除? – Jagadeesan

+2

@Jagadeesan:只有超時,一如往常一樣。 – hakre

1

我想,如果你能得到用戶的PHP會話ID,你可以做:

session_id("<that session id>"); 
session_start(); 
session_destroy(); 

注意,這也意味着管理員將失去其會話。 session_id()被描述爲here

1

如果你想結束一個用戶會話,你可以在邏輯上或技術上做到這一點。

邏輯上,您可以篡改用戶會話數據並將刪除標誌設置爲true。然後,您的應用程序邏輯需要檢查是否設置了刪除標誌,如果是,請結束該用戶的會話。

從技術上講,您可以通過刪除會話存儲來結束任何會話。這取決於您配置了哪個存儲,但基本上這意味着獲取會話文件的文件名並將其從磁盤中刪除。

我認爲第二個變種更容易。只需獲取用戶會話標識並將其映射到文件名即可。見here for the pathhere for path and name

對於邏輯變體,您實際上還需要收集會話數據的文件名,將其打開並讀取它的內容,而不是添加標誌並再次存儲它。

所以這些是我想到的兩種方式來實現你要找的東西。如果將會話數據放入數據庫,可能會更容易:Storing Sessions in a Database

相關問題