首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将cookie从php curl获取到变量中

如何将cookie从php curl获取到变量中
EN

Stack Overflow用户
提问于 2009-05-21 23:31:12
回答 7查看 200K关注 0票数 137

因此,其他公司的一些人认为,如果不使用soap或xml-rpc或rest或任何其他合理的通信协议,而只是将所有响应作为cookie嵌入到报头中,那就太棒了。

我需要从这个curl响应中取出这些cookie,希望它是一个数组。如果我不得不为此浪费大量的时间来编写解析器,我会非常不高兴。

有没有人知道如何简单地做到这一点,最好不向文件中写入任何内容?

如果有人能帮我解决这个问题,我将不胜感激。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-05-21 23:55:43

代码语言:javascript
复制
$ch = curl_init('http://www.google.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// get headers too with this line
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
// get cookie
// multi-cookie variant contributed by @Combuster in comments
preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches);
$cookies = array();
foreach($matches[1] as $item) {
    parse_str($item, $cookie);
    $cookies = array_merge($cookies, $cookie);
}
var_dump($cookies);
票数 185
EN

Stack Overflow用户

发布于 2014-08-03 03:50:29

尽管这个问题已经很久了,而且接受的响应也是有效的,但我还是觉得有点不舒服,因为HTTP响应的内容(HTML、XML、JSON、二进制或其他任何格式)与报头混合在一起。

我找到了一个不同的选择。CURL提供了一个选项(CURLOPT_HEADERFUNCTION)来设置将为每个响应标头行调用的回调。该函数将接收curl对象和带有标题行的字符串。

您可以使用如下代码(改编自TML响应):

代码语言:javascript
复制
$cookies = Array();
$ch = curl_init('http://www.google.com/');
// Ask for the callback.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "curlResponseHeaderCallback");
$result = curl_exec($ch);
var_dump($cookies);

function curlResponseHeaderCallback($ch, $headerLine) {
    global $cookies;
    if (preg_match('/^Set-Cookie:\s*([^;]*)/mi', $headerLine, $cookie) == 1)
        $cookies[] = $cookie;
    return strlen($headerLine); // Needed by curl
}

这种解决方案的缺点是使用全局变量,但我想这对于短小的脚本来说不是问题。而且,如果curl被包装到一个类中,则可以始终使用静态方法和属性。

票数 42
EN

Stack Overflow用户

发布于 2011-08-25 00:49:54

这不需要正则表达式,但需要PECL HTTP extension

代码语言:javascript
复制
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
curl_close($ch);

$headers = http_parse_headers($result);
$cookobjs = Array();
foreach($headers AS $k => $v){
    if (strtolower($k)=="set-cookie"){
        foreach($v AS $k2 => $v2){
            $cookobjs[] = http_parse_cookie($v2);
        }
    }
}

$cookies = Array();
foreach($cookobjs AS $row){
    $cookies[] = $row->cookies;
}

$tmp = Array();
// sort k=>v format
foreach($cookies AS $v){
    foreach ($v  AS $k1 => $v1){
        $tmp[$k1]=$v1;
    }
}

$cookies = $tmp;
print_r($cookies);
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/895786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档