访问所有服务器会话变量

时间:2014-05-04 18:09:43

标签: php session

我想到了一些帮助来管理我的开发localhost上的会话变量。

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

据我所知,从PHP开始,我只能访问当前的主机会话变量,这些变量将在调用session_start后填充到$ _SESSION变量。这对我的需求来说还不够。

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

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

还有更好的方法吗? 也许已经有专门的工具来完成这项任务了?

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

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

1 个答案:

答案 0 :(得分: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://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_start阻止脚本执行,而#34;会话ID"正在使用另一个请求。我认为不建议通过CLI脚本运行它,因为嵌入在WebServers和PHP CLI上的PHP使用不同的环境和配置(除了PHP CLI的运行用户必须与运行WebServer的用户相同)防止权限拒绝。。

我认为理想的解决方案是定期使用HTTP GET触发对此脚本的请求(通过linux crontab或类似方法),当然这个解决方案取决于计划的最终用途。如果可以完成HTTP请求触发,则可以消除保存先前设置和会话的部分代码。