比如通過後台,刪除某個session,讓該使用者登入狀態失效
補充:
是不同會話之間操作session,可能只知道username這樣的值。
回複內容:
比如通過後台,刪除某個session,讓該使用者登入狀態失效
補充:
是不同會話之間操作session,可能只知道username這樣的值。
如果你使用 php 原生 的 session 實現的話。
搞清楚兩個問題
- 你需要知道原生php在進行session操作的時候的生命週期。[php.session] 文檔。
- 還要有一套具體實現流程。
來說說以上兩個問題。
第一個問題
英文原文:
The callbacks specified in session_set_save_handler() are methods called by PHP during the life-cycle of a session: open, read, write and close and for the housekeeping tasks: destroy for deleting a session and gc for periodic garbage collection.
大意就是說,通過session_set_save_handler() 來指定一些回調方法,來供php在他的生命週期中調用。php 操作session的生命週期(life-cycle),分別為 open, read, write, close。在日常開發過程中,銷毀 (destroy) 一個session,session垃圾清理機制會週期性去清理。(關於session的垃圾清理你可以在,php.ini檔案中配置)
php預設管理sessiopn的方式是以檔案形式存放在本地的硬碟上。(雖然很低效,但是很實用)以session_id作為檔案名稱,檔案的內容就是session中序列化的內容。
方法定義
bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid ] )
在 php 5.4.0 你可以通過實現 SessionHandlerInterface 介面或繼承 SessionHandler 類來使用。
如果想使用自訂產生 session_id 的功能還要實現 SessionIdInterface。
session_set_save_handler
As of PHP 5.4.0 you may create session handlers using the SessionHandlerInterface or extend internal PHP handlers by inheriting from SessionHandler。
繼承SessionHandler可以在系統預設的實現上做一些修改。實現SessionHandlerInterface需要完全重寫php預設的session管理方式。
他們的特點就是你可以繼續使用 session_start, session_id, $_SESSION 而無需理會他們底層是怎麼實現的。
本人一直反對在 php 語言發行版中搭載 http 的功能。這使得php變得很笨重不容易擴充,我也從不使用php原生的http功能。我現在的php版本是5.4。在開發php項目中,我大多數是使用 symfony2 架構或 symfony2 httpfoundation bundle。
第一個問題就搞定了,來看看第二個問題
第二個問題, 具體實現流程
如果我們 使用 session_set_save_handler 方法。通過它我們就可以管理每一個session。
我們可以在每一session建立的時候,把session的id記錄下來。
php // 一下以檔案系統作為儲存介質實現一個簡單的 `session handler` key = $key; $this->savePath = session_save_path(); } public function create_sid() { // 產生 session id $session_id = uniqid('sess_', true); // 關鍵點 儲存這個 id db_store('session_ids', $session_id); return $session_id; } // 通過 session id 讀取 session 中資料的方法 public function read($id) { $data = parent::read($id); return mcrypt_decrypt(MCRYPT_3DES, $this->key, $data, MCRYPT_MODE_ECB); } // 修改session中資料的方法 public function write($id, $data) { $data = mcrypt_encrypt(MCRYPT_3DES, $this->key, $data, MCRYPT_MODE_ECB); return parent::write($id, $data); } // 簡單實現,最好清除一下用戶端 session_cookie public function destroy($id) { $file = "$this->savePath/sess_$id"; if (file_exists($file)) { unlink($file); } return true; }}// main fun// configini_set('session.save_handler', 'files');ini_set('session.save_path', './data/sessions'); //將 session 檔案儲存在項目中// 執行個體化 handle$handler = new MySessionHandler('mykey');// 應用 handlesession_set_save_handler($handler, true);// 可以使用 $handler 是完成一切工作
遺憾的是 session_set_save_handler 方法在 php5.5.1 版本之前並沒有去管理產生 session_id,也就是實現 create_sid 方法是沒有用的,因為 php5.5.1 之前的版本沒有 SessionIdInterface 介面 session_set_save_handler 方法也沒有對此介面做調整。
這也是我為什麼不用 php 原生http的原因之一,如果使用symfony2的話,幾乎沒有任何限制,應為一切都是從 php://input 開始 從 php://output結束。
不廢話了。
使用 handler 你就可以實現上面那樣管理 session 使用者。
php// 擷取一個 session id$a_sess_id = db_query('session_ids')[0];// 擷取session資料$sess_data = $handler->read($a_sess_id);// 修改這個session$handler->write($a_sess_id, $new_data);// 銷毀這個 session$handler->destroy($a_sess_id, $new_data);
希望對你有多協助,還有建議所有看到這個"文章"(就叫文章吧)的朋友不要在使用 php 原生 http 的功能了,$_GET, $_SERVER, $_COOKIES, $_SESSION 等等如此,真的很醜陋,他是php萬惡的根源之一。
[symfony HttpFoundation] 項目告訴你我們應該如何正確的使用php開發web。當然你最好直接使用 symfony
自己根據需要的索引(username等)和 session_id 在後台維護一個 session 池,然後就可以操作索引對應的 session 內容。
PHP 預設是檔案儲存 session 的,刪除檔案或者讀取後操作資料都隨你了。
用其他的像 memcache,redis 什麼的會不會更容易些?
只能說提供一個思路,具體可行不可行還是要嘗試。
首先理解什麼是session,我們知道用戶端是不存session的,只是存的一個cookies,而伺服器是怎麼知道這個用戶端對應的session的,實際上他是通過用戶端帶過來的cookies去尋找的,擷取的方法是通過這個session_id(),該函數如果不傳參數的話,擷取的要麼是本次請求對應的session,要麼是空,不可能是其他使用者的session,如果傳參數的話,首先你必須知道其他使用者的session_id,但這個怎麼拿,我也不知道。