【问题标题】:Access all server session variables访问所有服务器会话变量
【发布时间】:2025-12-02 04:35:01
【问题描述】:

我想到了一些帮助程序来管理我的开发本地主机上的会话变量。

我想从我机器上的所有虚拟主机中读取、更改和删除会话变量。

据我所知,在 PHP 中我只能访问当前主机会话变量,在调用 session_start 之后,这些变量将填充到 $_SESSION 变量中。这还不足以满足我的需求。

经过一些研究(例如Access active sessions in PHP)我找到了解决方案:

  • 从 php session 目录加载所有文件
  • 使用session_decode 将数据加载到$_SESSION 变量中
  • 读取/更改/删除一些变量
  • 使用session_encode 将我的会话编码回文件

有没有更好的方法来做到这一点? 也许已经有专门的工具来完成这项任务?

编辑: 我现在使用的另一个解决方案是在 IDE 中为所需项目启用调试器,并使用手表/堆栈窗口来编辑会话。

编辑2: 我不想要任何特定于项目的解决方案,例如将会话数据存储在数据库中。对于任何项目,这应该“开箱即用”。 为了更好地理解,使用示例: 在 magento 管理面板中,网格过滤器存储在会话变量中。 当您启用损坏的过滤器时,会出现一个错误页面,并且您无法在不删除会话 cookie 或为其设置调试器的情况下轻松禁用此过滤器。

【问题讨论】:

  • 你可以use a database 然后查询它。只是一个想法
  • @HamZa 我已经编辑了我的问题。
  • 没有适用于每个项目的解决方案,因为每个项目都可以指定自己的会话处理程序(例如,保存到数据库的处理程序)。您需要挂钩到每个项目的特定会话处理程序(标准 PHP 处理程序除外)。
  • @ComFreek AFAIK 大多数 php 应用程序/框架仍然使用 PHP 会话机制。否则他们将需要一些“默认数据库”来保存。现在,让我们假设我们讨论的是 PHP 会话机制。保存在数据库中的会话很容易使用任何数据库管理器进行管理(如果你知道格式)。

标签: php session


【解决方案1】:

我曾经花一些时间使用以编程方式“使”服务器会话“过期”的脚本来获取有关用户不活动的信息。那个时候,我有一个带有 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://*.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();
}

我不建议在客户端请求时运行此代码。请记住,在另一个请求中使用“会话 ID”时 session_start 会阻止脚本执行。而且我认为不建议通过 CLI 脚本运行它,因为嵌入在 WebServers 和 PHP CLI 上的 PHP 使用不同的环境和配置(除了 PHP CLI 的运行用户必须是运行 WebServer 的同一用户之外)防止权限拒绝)。

我认为理想的解决方案是定期使用 HTTP GET 触发对该脚本的请求(通过 linux crontab 或类似方法),当然此解决方案取决于计划的最终用途。如果可以做HTTP请求触发,那么保存之前设置和会话的部分代码就可以去掉了。

【讨论】: