簡體   English   中英

訪問所有服務器會話變量

[英]Access all server session variables

我想到了一些在我的開發localhost上管理會話變量的助手。

我想從我的計算機上的所有虛擬主機中讀取,更改和刪除會話變量。

據我所知,從PHP我只能訪問當前的主機會話變量,在調用session_start之后將填充到$ _SESSION變量。 這還不足以滿足我的需求。

經過一番研究(例如訪問PHP中的活動會話 ),我找到了解決方案:

  • 從php會話目錄加載所有文件
  • 使用session_decode將數據加載到$ _SESSION變量
  • 讀取/更改/刪除一些變量
  • 使用session_encode將我的會話編碼回文件

有更好的方法嗎? 也許已經有專門用於該任務的工具?

編輯:我目前使用的另一種解決方案是僅在IDE中為所需項目啟用調試器,然后使用watch / stack窗口編輯會話。

EDIT2:我不需要任何特定於項目的解決方案,例如將會話數據存儲在數據庫中。 對於任何項目,這都應該“開箱即用”。 為了更好地理解,請使用示例:在magento管理面板中,網格過濾器存儲在會話變量中。 當您啟用損壞的過濾器時,會出現一個錯誤頁面,並且如果不刪除會話cookie或為其設置調試器,就無法輕松禁用此過濾器。

我花了一些時間用腳本編程地“終止”服務器會話,以獲取有關用戶不活動的信息。 在那種情況下,我有一個帶有session_ids的數據庫,但是可以通過目錄列表來完成(請注意,這是php針對代碼的編譯建議)

//Preserve runtime variable
$pre_config = ini_get('session.use_cookies');
//Check previous session_start();
if($previous_sid = session_id()){
    //close and save current session 
    session_write_close();
}

//To determine where php session files are stored, see http://stackoverflow.com/questions/4927850/location-for-session-files-in-apache-php
if(($save_path = session_save_path()) === ''){
    // PHP compilation specific
    // There are diferences between CLI (saves in sys_get_temp_dir()) and mod_php (where session_save_path() works) on Fedora 12
    $save_path =  '/var/lib/php/session/';
    session_save_path('/var/lib/php/session/');
}

//Avoid new cookies from other session_start()
ini_set('session.use_cookies', false);

//Do the magic
if ($handle = opendir($save_path)) {
    while (false !== ($entry = readdir($handle))) {
        if (strpos($entry, 'sess_') === 0) {
            $session_id = str_replace('sess_' , '', $entry);
            session_id($session_id);
            session_start();
            //Do whatever you want with this session, using $_SESSION 
            session_write_close();
        }
    }

    closedir($handle);
}

//Restore previous configuration
ini_set('session.use_cookies', $pre_config);
//Restore previous session
if($previous_sid) {
    session_id($previous_sid);
    session_start();
}

我不建議應客戶要求運行此代碼。 請記住,在另一個請求上使用“ session id”時,session_start會阻止腳本執行。 而且我認為不建議通過CLI腳本運行它,因為嵌入在WebServers和PHP CLI上的PHP使用不同的環境和配置(事實上,PHP CLI的運行用戶必須與運行WebServer的用戶相同。防止許可被拒絕)。

我認為理想的解決方案是使用HTTP GET定期(通過linux crontab或類似工具)觸發對該腳本的請求,當然,此解決方案取決於最終的使用計划。 如果可以完成HTTP請求觸發,則可以省去保存先前設置和會話的代碼部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM