【问题标题】:Writing variables to a session file manually with php使用 php 手动将变量写入会话文件
【发布时间】:2025-12-01 12:05:03
【问题描述】:

我有一个不寻常的问题。我需要能够为任何给定用户的会话(我自己的会话除外)手动更改会话变量。该应用程序管理呼叫中心的员工。

每个用户都有一个名为“status”的会话变量,它可以等于“online”、“in-call”、“on-break”等。

当用户休息时,他们的$_SESSION['status'] 会更改为“休息时”。有些人有不点击“开始休息”按钮的习惯,所以我的老板问我是否可以给她功能让人们从她的管理员级帐户中退出。

我不想将“中断”功能转换为使用数据库,因为这将是一个额外的查询,我必须手动添加到大约 50 个文件中。

我知道按照惯例这是不可能的,但我希望得到一些非常规的答案。例如,这是否可以通过在服务器本身上打开并写入会话文件来实现?

【问题讨论】:

  • 有人吗?我正在努力解决这个问题,但到目前为止还没有运气。

标签: php file session fopen


【解决方案1】:

查看http://php.net/manual/en/function.session-id.php

无论您尝试做什么,尝试修改会话变量。我认为在不涉及数据库的情况下真的没有办法做到这一点。您可以使用 session_id() 来存储主管的会话 id,将她的 $_SESSION 更改为其他用户,更改状态,然后将其更改回她自己的会话,但我不知道您如何在除了在会话开始时将其放入数据库之外,它还处于首位。

解决任何需要您更改 50 个不同文件以添加一小部分功能的问题从长远来看可能比“非常规答案”更好。

【讨论】:

  • 这或多或少是我想做的。所有会话 ID 在数据库中都很容易获得,但会话变量不是。我想我会试一试。
【解决方案2】:

据我了解,您需要删除用户的会话才能将其注销。您可以物理删除服务器上的特定用户会话文件,但它很脆弱且不安全(恕我直言)。

最好将会话保存在数据库中,然后您可以轻松操作/删除它。编写自定义会话处理程序的官方指南是here

如果您不想自己编写,可以使用 3rd 方解决方案,例如this one.

【讨论】:

    【解决方案3】:

    如果您使用的是 apache 服务器,则任何类型的会话创建都保存在名为 tmp 的文件夹中,其名称类似于“sess409080ffgfsfs.tmp”。现在您只需找出您要查找的现有文件中的哪一个。

    【讨论】:

      【解决方案4】:

      事实证明,这不仅是可能的,而且非常容易。首先,将当前 session_id() 保存到一个变量,然后 session_write_close(),然后使用要编辑的会话的会话 id 启动一个新会话,编辑会话,然后再次 session_write_close 并使用 session_id 重新启动会话保存在上述变量中​​。

      $temp = array();
      $temp['tempid'] = session_id();
      foreach($_SESSION as $key=>$val){
          $temp[$key]=$val;
      }
      $MESSAGE = "<h2>You have been remotely logged out by admin.</h2><h3>Please see ".$_SESSION['fname']." ".$_SESSION['lname']." before returning to work.</h3>";
      session_write_close(); //end admin sesh
      
      session_id($_GET['session']); //start remote sesh
      session_start(); 
      
      //Make changes to remote sesh here
      
      session_write_close();
      
      session_id($temp['tempid']); //restart local sesh
      session_start();
      foreach($temp as $key=>$val){
          $_SESSION[$key]=$val;
      }
      

      【讨论】: