Php 使变量在两个会话之间保持不变

Php 使变量在两个会话之间保持不变,php,drupal-7,Php,Drupal 7,我希望我能把我的问题解释得足够清楚,而不增加太多细节。我有一个网站,我试图使一个变量在两个不同的会话之间持久化。一个在用户客户端和站点之间,一个在外部API服务和站点之间 步骤1:用户客户端使用ajax向服务器发送请求。在服务器端,此请求得到处理,如果一切正常,我的站点将向外部API服务发送请求。如果一切正常,并且我的站点向用户客户端发送成功响应,则此外部服务返回true 步骤2:延迟(最多3分钟)后,外部API服务向我的站点上的自定义回调URL发送一个新的单独POST请求。现在外部服务是代理客

我希望我能把我的问题解释得足够清楚,而不增加太多细节。我有一个网站,我试图使一个变量在两个不同的会话之间持久化。一个在用户客户端和站点之间,一个在外部API服务和站点之间

步骤1:用户客户端使用ajax向服务器发送请求。在服务器端,此请求得到处理,如果一切正常,我的站点将向外部API服务发送请求。如果一切正常,并且我的站点向用户客户端发送成功响应,则此外部服务返回true

步骤2:延迟(最多3分钟)后,外部API服务向我的站点上的自定义回调URL发送一个新的单独POST请求。现在外部服务是代理客户端,我的站点是代理服务器。在捕获此回调的函数中,我希望使用函数save_data()保存发布的数据

步骤3:用户客户端发送第二个ajax调用,以检查外部服务是否已发布任何数据。这里我想使用相同的函数save_data()来检索步骤2中保存的数据

这就是我目前所拥有的

// callback from external service acting as client
function _api_callback() {
  $data = json_decode(file_get_contents("php://input"), $assoc = true);
  save_data('test', serialize($data)); // save data from external service
}
上述函数从外部服务捕获数据,并使用函数
save_data()
保存数据

在上面的函数中,捕获了来自客户端的ajax调用,并使用函数save_data()从先前保存的外部API服务检索数据

// save data from external service to make it available for user client
function save_data($key, $value = NULL) {
  global $user;
  static $storage;
  if ($value) {
    $storage[$key] = $value;
    $_SESSION['lists'][$key] = $value;
  }
  else if (empty($storage[$key]) && isset($_SESSION['lists'][$key])) {
    $storage[$key] = $_SESSION['lists'][$key];
  }
  return $storage[$key];
}
上面的函数用于在从外部API捕获数据时保存数据,并在用户客户端签入以查看外部服务是否发送了任何数据时检索数据。我找到了这个函数

问题:上述方法不起作用,没有从函数save_data()中检索到任何内容,因此如何使从外部服务接收的数据可用于上面步骤3中的第二个ajax调用


我还应该提到,我知道外部服务的第二次单独回调实际上是用200代码接收的,检查站点上的访问日志。

不要依赖会话进行回发,因为它们依赖于cookie,我不相信外部服务会接受或管理它们。在回发URL[或数据,如果提供商允许]中嵌入一个唯一ID,并使用该ID将回发与其原始请求关联起来。或者使用一些缓存,如
redis
。Sammitch:感谢您的建议。我将详细了解如何做到这一点。API服务回调和用户不会有不同的会话吗?我想你真的想把数据存储在某种数据库里。梅尔:是的,你说得对。这也是问题的标题所表明的。我希望这是一种避免db的方法,而是使用静态会话变量,但是我现在意识到我必须使用db来保存和检索API服务回调中的回调数据。谢谢大家的评论。
// save data from external service to make it available for user client
function save_data($key, $value = NULL) {
  global $user;
  static $storage;
  if ($value) {
    $storage[$key] = $value;
    $_SESSION['lists'][$key] = $value;
  }
  else if (empty($storage[$key]) && isset($_SESSION['lists'][$key])) {
    $storage[$key] = $_SESSION['lists'][$key];
  }
  return $storage[$key];
}