当前位置:  开发笔记 > 编程语言 > 正文

如何将PHP卷曲中的cookie转换为变量

如何解决《如何将PHP卷曲中的cookie转换为变量》经验,为你挑选了4个好方法。

所以其他公司的一些人认为如果不是使用soap或xml-rpc或其他合理的通信协议而是将其所有响应作为cookie嵌入标题中,那将是非常棒的.

我需要将这些cookie拉出来,希望这个卷曲响应中有一个数组.如果我不得不浪费我的一生为此写一个解析器,我会非常不高兴.

有谁知道如何简单地完成这项工作,最好不要在文件中写任何东西?

如果有人能帮我解决这个问题,我将非常感激.



1> TML..:
$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);


不幸的是,我觉得这是正确的答案.我认为卷曲不仅可以把我的映射数据交给我,这是荒谬的.
对于抓取多个cookie的组合修复:`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); }`
@thirsty93卷曲不能递给你一个映射的数组.但是向你展示了一种保存它的方法`curl_setopt($ ch,CURLOPT_HEADERFUNCTION,'callback_SaveHeaders');`
我会把它给你,但preg_match错了.我不只是想要会议,我明白为什么你会这么想.但制作系统的天才正在使用整个响应地图加载cookie,例如获取或发布.狗屎这样:Set-Cookie:price = 1 Set-Cookie:status = accept我需要一个带有'/ ^ Set-Cookie的preg_match_all :(.*?)=(.*?)$/sm'
根据返回的cookie结构,最后一行可能需要修改为类似`parse_str($ m [1],$ cookies)`,这会将cookie填充到`$ cookies`变量中的关联数组中. ..

2> 小智..:

虽然这个问题很老,并且接受的响应是有效的,但我觉得它有点不合适,因为HTTP响应的内容(HTML,XML,JSON,二进制或其他)与标题混合在一起.

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

您可以使用这样的代码(改编自TML响应):

$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包装到类中,您始终可以使用静态方法和属性.


您可以使用包含对`$ cookies`的引用的闭包,而不是全局.`$ curlResponseHeaderCallback = function($ ch,$ headerLine)使用(&$ cookies){`then`curl_setopt($ ch,CURLOPT_HEADERFUNCTION,$ curlResponseHeaderCallback);`.

3> 小智..:

这样做没有正则表达式,但需要PECL HTTP扩展.

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



4> SoapBox..:

如果使用CURLOPT_COOKIE_FILE和CURLOPT_COOKIE_JAR,curl将从/向文件读取/写入cookie.完成卷曲后,您可以根据需要阅读和/或修改它.


我认为目标不是使用这个文件
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有