PHP如何操作指定的session?

來源:互聯網
上載者:User
比如通過後台,刪除某個session,讓該使用者登入狀態失效
補充:
是不同會話之間操作session,可能只知道username這樣的值。

回複內容:

比如通過後台,刪除某個session,讓該使用者登入狀態失效
補充:
是不同會話之間操作session,可能只知道username這樣的值。

如果你使用 php 原生 的 session 實現的話。

搞清楚兩個問題

  1. 你需要知道原生php在進行session操作的時候的生命週期。[php.session] 文檔。
  2. 還要有一套具體實現流程。

來說說以上兩個問題。

第一個問題

英文原文:
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 的,刪除檔案或者讀取後操作資料都隨你了。

用其他的像 memcacheredis 什麼的會不會更容易些?

只能說提供一個思路,具體可行不可行還是要嘗試。
首先理解什麼是session,我們知道用戶端是不存session的,只是存的一個cookies,而伺服器是怎麼知道這個用戶端對應的session的,實際上他是通過用戶端帶過來的cookies去尋找的,擷取的方法是通過這個session_id(),該函數如果不傳參數的話,擷取的要麼是本次請求對應的session,要麼是空,不可能是其他使用者的session,如果傳參數的話,首先你必須知道其他使用者的session_id,但這個怎麼拿,我也不知道。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.