【问题标题】:Guzzle PHP - persist session across subsequent requestsGuzzle PHP - 在后续请求中保持会话
【发布时间】:2021-07-31 21:19:15
【问题描述】:

我正在使用我的 Laravel 应用程序中的 Guzzle 来 CURL 到另一个 PHP 应用程序。

我遇到的问题是在发出后续 CURL 请求后,会话没有被持久化。这当然是有道理的——因为每个 CURL 请求都是一个唯一的会话。

例如,在我的目标应用程序中,假设我这样做:

$_SESSION['action_id'] = 1234;

然后在我的下一个请求中,我想做:

$action_id = $_SESSION['action_id'];

我收到未定义的索引错误。我查看了有关 cookie 的文档页面 (https://docs.guzzlephp.org/en/latest/quickstart.html#cookies),其中说:

如果您想对所有请求使用共享 cookie jar,可以在客户端构造函数中将 cookie 设置为 true。

所以我尝试如下:

$client = new \GuzzleHttp\Client(['cookies' => true]);

但这并没有什么不同。在我的目标应用程序中,如果我执行var_dump($_COOKIES['PHPSESSID']),它将返回null$_COOKIE 本身总是空的。如果我这样做var_dump(session_id()),我每次都会得到不同的值。所以这就是问题所在 - 当我发出后续请求时,我需要访问同一个会话。

有谁知道我如何做到这一点?

【问题讨论】:

标签: php guzzle


【解决方案1】:

我找到了答案。解决方案是这样做:

$jar = \GuzzleHttp\Cookie\CookieJar::fromArray(
    [
        'PHPSESSID' => $request->session()->getId(),
    ],
    'example.org'
);

$client = new \GuzzleHttp\Client([
    'cookies'  => $jar,
]);

我不知道为什么我必须这样做——本质上我是从我的源应用程序中获取会话 ID 并使用它在目标应用程序中创建 PHPSESSID cookie。奇怪,但这对我有用。现在,当我执行 var_dump(session_id()) 时,每个请求都会得到相同的值。

在 Guzzle GitHub 问题页面上,有人发布了以下解决方案 (https://github.com/guzzle/guzzle/issues/1400):

$jar = new SessionCookieJar('PHPSESSID', true);
$client = new Client(['cookies' => $jar]);

但这对我没有用。我希望它会,因为它看起来像是自动处理它。也许有人可以对此有所了解?

【讨论】:

    【解决方案2】:

    你需要先启动一个 php 会话:

    session_start();
    $jar = new SessionCookieJar('CookieJar', true); //'CookieJar' is the PHP Session Variable where it will be saved the cookie, it's not the cookie key... $_SESSION['CookieJar']
    $client = new Client(['cookies' => $jar]);
    

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 2016-04-12
      • 2011-10-29
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多