如何将 cookie 从 php curl 获取到变量中
因此,其他公司的某个人认为,如果不是使用 soap 或 xml-rpc 或 rest 或任何其他合理的通信协议,而是将所有响应作为 cookie 嵌入到标头中,那将非常棒。
我需要从这个卷曲响应中取出这些cookie作为数组。如果我不得不浪费一堆生命来为此编写解析器,我会非常不高兴。
有谁知道如何简单地完成此操作,最好不向文件写入任何内容?
如果有人能帮助我解决这个问题,我将不胜感激。
因此,其他公司的某个人认为,如果不是使用 soap 或 xml-rpc 或 rest 或任何其他合理的通信协议,而是将所有响应作为 cookie 嵌入到标头中,那将非常棒。
我需要从这个卷曲响应中取出这些cookie作为数组。如果我不得不浪费一堆生命来为此编写解析器,我会非常不高兴。
有谁知道如何简单地完成此操作,最好不向文件写入任何内容?
如果有人能帮助我解决这个问题,我将不胜感激。
$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);
尽管这个问题已经很老了,并且接受的响应是有效的,但我发现它有点不舒服,因为HTTP响应的内容(HTML,XML,JSON,二进制或其他)与标头混合在一起。
我找到了一个不同的选择。CURL 提供了一个选项 () 来设置将为每个响应标头行调用的回调。该函数将接收 curl 对象和带有标题行的字符串。CURLOPT_HEADERFUNCTION
您可以使用这样的代码(改编自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 被包装到一个类中,你总是可以使用静态方法和属性。