想實現一個踢出會員的功能,但是PHP中怎麼做呢,我的想法是記錄每次會員登入的session id,要踢某個會員的時候通過這個ID去把伺服器上的這個session刪除,達到踢人的效果,但是不知道PHP中能否通過 session id刪除某個session,請教大家!!!
回複討論(解決方案)
既然你能 記錄每次會員登入的session id(顯然要儲存到資料庫裡)
那麼你就直接將 session 的檔案方式改成資料庫方式不就得了
想踢哪個就把相應的記錄刪去就是了
既然你能 記錄每次會員登入的session id(顯然要儲存到資料庫裡)
那麼你就直接將 session 的檔案方式改成資料庫方式不就得了
想踢哪個就把相應的記錄刪去就是了
謝謝版主回答,可以不可以說得詳細點,我現在是將session id儲存在資料庫裡面,關鍵是用戶端呀,比如你在後台擷取了某個會員的session id,如何將用戶端那邊的session失效,這樣就能踢出會員了,版主說的刪除相應的記錄是什麼意思?用PHP不久,見笑了
session是存放在伺服器的,你刪除後用戶端的session就擷取不到了只能重新登入。
session是存放在伺服器的,你刪除後用戶端的session就擷取不到了只能重新登入。
我想知道怎麼做啊,怎麼刪除,查了一下函數只有session_destroy(),這個函數還沒有參數,只能刪除本帳號登入的SESSION,要刪除其它的通過SESSIONID怎麼刪除呢
版主意思是把session儲存在db而不是儲存在檔案,因為你session id已經儲存在db了,可以把session都儲存在db,這樣方便操作。然後根據session id來刪除對應的db記錄來實現了。
如果session是儲存在檔案的,也可以通過session id來刪除檔案實現。
session檔案的儲存位置是 session.save_path,可用phpinfo(); 查到
session_start();$_SESSION['test'] = 1;echo session_id();
以上代碼執行後,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中會產生 sess_iak6l6lurg6o63a00tsdi0a4m5 檔案,這個就是session檔案。
然後根據iak6l6lurg6o63a00tsdi0a4m5 這個session id執行刪除檔案操作就可以了。
版主意思是把session儲存在db而不是儲存在檔案,因為你session id已經儲存在db了,可以把session都儲存在db,這樣方便操作。然後根據session id來刪除對應的db記錄來實現了。
如果session是儲存在檔案的,也可以通過session id來刪除檔案實現。
session檔案的儲存位置是 session.save_path,可用phpinfo(); 查到
session_start();$_SESSION['test'] = 1;echo session_id();
以上代碼執行後,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中會產生 sess_iak6l6lurg6o63a00tsdi0a4m5 檔案,這個就是session檔案。
然後根據iak6l6lurg6o63a00tsdi0a4m5 這個session id執行刪除檔案操作就可以了。
感謝,我試試看,謝謝了
既然你能 記錄每次會員登入的session id(顯然要儲存到資料庫裡)
那麼你就直接將 session 的檔案方式改成資料庫方式不就得了
想踢哪個就把相應的記錄刪去就是了
版主如果按照這樣的方式那我刪除了某一個使用者的session id,使用者每次訪問一個頁面的時候都還要查詢一次資料庫,判斷session id還存在不,如果不存在就證明被T下線了,是這樣嗎?
版主意思是把session儲存在db而不是儲存在檔案,因為你session id已經儲存在db了,可以把session都儲存在db,這樣方便操作。然後根據session id來刪除對應的db記錄來實現了。
如果session是儲存在檔案的,也可以通過session id來刪除檔案實現。
session檔案的儲存位置是 session.save_path,可用phpinfo(); 查到
session_start();$_SESSION['test'] = 1;echo session_id();
以上代碼執行後,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中會產生 sess_iak6l6lurg6o63a00tsdi0a4m5 檔案,這個就是session檔案。
然後根據iak6l6lurg6o63a00tsdi0a4m5 這個session id執行刪除檔案操作就可以了。
用unlink ($myfile);刪除檔案的時候提示沒有許可權,怎麼擷取許可權才能夠刪除session 的檔案呢?
session_set_save_handler 到資料庫方式後
相關操作由 php 自動完成,無需你在寫代碼
檔案方式的 session 臨時檔案在使用者操作期間是被鎖定的,你只有在使用者兩次操作之間用
session_id(使用者的sessionid);
session_unset();
session_write_close();
來刪除該sessionid的臨時檔案
session_set_save_handler 到資料庫方式後
相關操作由 php 自動完成,無需你在寫代碼
檔案方式的 session 臨時檔案在使用者操作期間是被鎖定的,你只有在使用者兩次操作之間用
session_id(使用者的sessionid);
session_unset();
session_write_close();
來刪除該sessionid的臨時檔案
明白了,我犯了一個錯誤,應該刪除其它session id的檔案,而不是正在訪問的session id,還有版主請教一下你,你說的
session_set_save_handler到資料庫方式後,相關操作由PHP自動完成,請問是什麼意思,我的意思是說,如果我要踢掉一個使用者,把資料庫中這個使用者的session id值設定為空白,然後被踢掉的這個使用者再訪問其它頁面的時候,再查詢一次自己的session id,如果為空白就被T掉了,我現在的理解是這樣,不知道對不對,是這樣嗎,版主,希望指點一下,感激!!!
對是這樣的,沒有了 sessionid 對應的記錄,就得重新登入了
對是這樣的,沒有了 sessionid 對應的記錄,就得重新登入了
謝謝版主的回複,可以結貼了
對是這樣的,沒有了 sessionid 對應的記錄,就得重新登入了
版主不好意思再請教一下你,這樣一個php檔案怎麼用呢
/*============================檔案說明========================================
@filename: session.class.php
@description: 資料庫儲存線上使用者session,實現線上使用者功能!
@notice: session到期時間一個小時,因為我們的網站是使用cookie(有效時間是1小時)登入。
因此我們只記錄使用者登入的時間,而不是重新整理一次更新一次
刪除資料庫中session記錄的動作發生在使用者逾時後執行這個檔案或正常退出(session_destory)
@database: database:sessions field:sessionid(char32),uid(int10),last_visit(int10)
=============================================================================
*/
class session {
private $db;
private $lasttime=3600;//逾時時間:一個小時
function session(&$db) {
$this->db = &$db;
session_module_name('user'); //session檔案儲存方式,這個是必須的!除非在Php.ini檔案中設定了
session_set_save_handler(
array(&$this, 'open'), //在運行session_start()時執行
array(&$this, 'close'), //在指令碼執行完成或調用session_write_close() 或 session_destroy()時被執行,即在所有session操作完後被執行
array(&$this, 'read'), //在運行session_start()時執行,因為在session_start時,會去read當前session資料
array(&$this, 'write'), //此方法在指令碼結束和使用session_write_close()強制提交SESSION資料時執行
array(&$this, 'destroy'), //在運行session_destroy()時執行
array(&$this, 'gc') //執行機率由session.gc_probability 和 session.gc_divisor的值決定,時機是在open,read之後,session_start會相繼執行open,read和gc
);
session_start(); //這也是必須的,開啟session,必須在session_set_save_handler後面執行
}
function unserializes($data_value) {
$vars = preg_split(
'/([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)|/',
$data_value, -1, PREG_SPLIT_NO_EMPTY |
PREG_SPLIT_DELIM_CAPTURE
);
for ($i = 0; isset($vars[$i]); $i++) {
$result[$vars[$i++]] = unserialize($vars[$i]);
}
return $result;
}
function open($path, $name) {
return true;
}
function close() {
$this->gc($this->lasttime);
return true;
}
function read($SessionKey){
$sql = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";
$query =$this->db->query($sql);
if($row=$this->db->fetch_array($query)){
return $row['uid'];
}else{
return "";
}
}
function write($SessionKey,$VArray) {
require_once(MRoot.DIR_WS_CLASSES .'db_mysql_class.php');
$db1=new DbCom();
// make a connection to the database... now
$db1->connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);
$db1->query("set names utf8");
$this->db=$db1;
$SessionArray = addslashes($VArray);
$data=$this->unserializes($VArray);
$sql0 = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";
$query0 =$this->db->query($sql0);
if($this->db->num_rows($query0)<=0){
if (isset($data['webid']) && !empty($data['webid'])) {
$this->db->query("insert into `sessions` set `session_id` = '$SessionKey',uid='".$data['webid']."',last_visit='".time()."'");
}
return true;
}else{
/*$sql = "update `sessions` set ";
if(isset($data['webid'])){
$sql .= "uid = '".$data['webid']."', " ;
}
$sql.="`last_visit` = null "
. "where `session_id` = '$SessionKey'";
$this->db->query($sql); */
return true;
}
}
function destroy($SessionKey) {
$this->db->query("delete from `sessions` where `session_id` = '$SessionKey'");
return true;
}
function gc($lifetime) {
$this->db->query("delete from `sessions` where unix_timestamp(now()) -`last_visit` > '".$this->lasttime."'");
return true;
}
}
?>
其它頁面要用到這個技術,是不是每個頁面都要引入這個類並且建立一個session類的對象呢,每個session 失效的時候是不是會調用函數destroy跟gc函數呢
好多大人啊,儲存到資料庫最好
版主意思是把session儲存在db而不是儲存在檔案,因為你session id已經儲存在db了,可以把session都儲存在db,這樣方便操作。然後根據session id來刪除對應的db記錄來實現了。
如果session是儲存在檔案的,也可以通過session id來刪除檔案實現。
session檔案的儲存位置是 session.save_path,可用phpinfo(); 查到
session_start();$_SESSION['test'] = 1;echo session_id();
以上代碼執行後,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中會產生 sess_iak6l6lurg6o63a00tsdi0a4m5 檔案,這個就是session檔案。
然後根據iak6l6lurg6o63a00tsdi0a4m5 這個session id執行刪除檔案操作就可以了。
用unlink ($myfile);刪除檔案的時候提示沒有許可權,怎麼擷取許可權才能夠刪除session 的檔案呢?
我測試過可以啊,你刪的是自己正在使用的session檔案嗎?那當然不行
版主意思是把session儲存在db而不是儲存在檔案,因為你session id已經儲存在db了,可以把session都儲存在db,這樣方便操作。然後根據session id來刪除對應的db記錄來實現了。
如果session是儲存在檔案的,也可以通過session id來刪除檔案實現。
session檔案的儲存位置是 session.save_path,可用phpinfo(); 查到
session_start();$_SESSION['test'] = 1;echo session_id();
以上代碼執行後,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中會產生 sess_iak6l6lurg6o63a00tsdi0a4m5 檔案,這個就是session檔案。
然後根據iak6l6lurg6o63a00tsdi0a4m5 這個session id執行刪除檔案操作就可以了。
用unlink ($myfile);刪除檔案的時候提示沒有許可權,怎麼擷取許可權才能夠刪除session 的檔案呢?
我測試過可以啊,你刪的是自己正在使用的session檔案嗎?那當然不行
確實,我刪除正在使用的,怪不得不行,session_set_save_handler這種方法應該是最好的,我試試看
session_set_save_handler 到資料庫方式後
相關操作由 php 自動完成,無需你在寫代碼
檔案方式的 session 臨時檔案在使用者操作期間是被鎖定的,你只有在使用者兩次操作之間用
session_id(使用者的sessionid);
session_unset();
session_write_close();
來刪除該sessionid的臨時檔案
$con = mysql_connect("127.0.0.1", "root" , "111111");
mysql_select_db("session");
function open($save_path, $session_name) {
return(true);
}
function close() {
return(true);
}
function read($id) {
if ($result = mysql_query("select * from session where id='$id'")) {
if ($row = mysql_fetch_array($result)) {
return $row["data"];
}
} else {
return "";
}
}
function write($id, $sess_data) {
$sql = "SELECT * FROM session WHERE id = '".$id."' limit 1";
$check=mysql_query($sql);
$total=mysql_num_rows($check);
$result = false;
if($total<=0){
$sql = "insert into `session` set `id` = '$id',data='".$sess_data."',last_visit='".time()."'";
mysql_query($sql);
}else{
$sql = "update session set data='$sess_data', last_visit='".time()."' where id='$id'";
$result = mysql_query($sql);
}
if ($result==true) {
return true;
} else {
return false;
}
}
function destroy($id) {
if ($result = mysql_query("delete * from session where id='$id'")) {
return true;
} else {
return false;
}
}
function gc($maxlifetime) {
$sql = "delete from `session` where unix_timestamp(now()) -`last_visit` > '60'";
$result = mysql_query($sql);
if ($result == true) {
echo $sql;
return true;
} else {
echo "error";
return false;
}
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
@ini_set('session.gc_probability', 1);
@ini_set('session.gc_divisor', 2);
@ini_set('session.gc_maxlifetime', 60);
session_start();
?>//檔案名稱session_user_start.php
版主求指點一下,我寫了2個頁面測試,
1.php
include 'session_user_start.php';
$_SESSION['test'] ="ok la";
echo "init ok";
?>
另外一個
2.php
include 'session_user_start.php';
echo $_SESSION['test'];
?>
可以訪問,但是60秒以後再去訪問2.php發現gc那個函數並沒有調用,請教一下怎麼樣才能在session失效的時候,訪問2.php讓GC這個 函數執行呢
gc那個可以寫一個crontab實現。
http://blog.csdn.net/fdipzone/article/details/7263361
gc那個可以寫一個crontab實現。
http://blog.csdn.net/fdipzone/article/details/7263361
gc有調用了,但是發現,其它頁面引入include 'session_user_start.php';
echo $_SESSION['test'];,發現在以前頁面賦值的SESSION到了引入的session的頁面,$_SESSION的值為空白了,奇怪
知道是什麼原因了read的時候要返回session的資料,這樣引入到其它頁面的時候才會得到session資料
使用static數組和session同時儲存使用者名稱+登入時間,驗證的時候取session的資料和數組的資料比較,可行嗎