Guzzle PHP - 在后续请求中保持会话

Guzzle PHP - persist session across subsequent requests

我正在使用 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),其中说:

You can set cookies to true in a client constructor if you would like to use a shared cookie jar for all requests.

所以我试过如下:

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

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

有谁知道我怎样才能做到这一点?

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

$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]);

但这对我没用。我希望它会,因为它看起来像是自动处理的。也许有人可以阐明这一点?

您需要先开始 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]);