Guzzle在传递PHPSESSID会话cookie时会挂起Apache

时间:2014-12-26 12:50:19

标签: php apache session session-cookies guzzle

我在一个PHP脚本中使用Guzzle get请求来获取另一个。

$guzzle->get("urltomysecondpage")->getBody();

但是,Guzzle不知道会话ID cookie,因此我的目标脚本无法访问会话变量。

文档说明我所要做的就是将“cookies”设置为“true”,Guzzle将使用与调用脚本相同的cookie集。

$guzzle->get("urltomysecondpage", ['cookies' => TRUE])->getBody();

但是,这根本行不通。目标脚本看不到cookie。文档还允许显式设置一组cookie,如下所示:

$guzzle->get("urltomysecondpage", ['cookies' => ['PHPSESSID'=>$_COOKIE['PHPSESSID']]])->getBody();

它可以工作,但是如果我指定其中一个cookie来获得密钥“PHPSESSID”则不行。如果我这样做,Apache服务器完全挂起。不仅是当前请求,而且它还停止响应所有请求。

发生了什么事?

2 个答案:

答案 0 :(得分:0)

我在使用cookies => true选项时遇到了一些麻烦。您是否尝试过提供默认CooieJar

示例:

$jar = new GuzzleHttp\Cookie\CookieJar();
$default = [
    "cookies" => $jar
];
$c = new GuzzleHttp\Client(["defaults" => $default]);

默认情况下,同一个cookie jar设置为该客户端发出的每个请求。

答案 1 :(得分:0)

网络服务器无法为2个请求打开同一会话。要解决此问题,您可以先关闭会话,然后在用Guzzle发出请求后重新打开它。

示例:

session_start();

$sessionId = session_id();

session_write_close();

$client = new Client(
    array(
        'base_uri' => 'http://www.yoursite.tld',
        'cookies' => false,
    )
);

$cookie = new GuzzleHttp\Cookie\SetCookie();
$cookie->setName('PHPSESSID');
$cookie->setValue($sessionId);
$cookie->setDomain('www.yoursite.tld');

$cookieJar = new CookieJar(
    false,
    array(
        $cookie,
    )
);

$response = $client->request(
    'GET',
    '/urltomysecondpage',
    array(
        'cookies' => $cookieJar,
    )
);

session_start();