how to get the cookies from a php curl into a variable how to get the cookies from a php curl into a variable curl curl

how to get the cookies from a php curl into a variable


$ch = curl_init('http://www.google.com/');curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// get headers too with this linecurl_setopt($ch, CURLOPT_HEADER, 1);$result = curl_exec($ch);// get cookie// multi-cookie variant contributed by @Combuster in commentspreg_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);


Although this question is quite old, and the accepted response is valid, I find it a bit unconfortable because the content of the HTTP response (HTML, XML, JSON, binary or whatever) becomes mixed with the headers.

I've found a different alternative. CURL provides an option (CURLOPT_HEADERFUNCTION) to set a callback that will be called for each response header line. The function will receive the curl object and a string with the header line.

You can use a code like this (adapted from TML response):

$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}

This solution has the drawback of using a global variable, but I guess this is not an issue for short scripts. And you can always use static methods and attributes if curl is being wrapped into a class.


This does it without regexps, but requires the PECL HTTP extension.

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 formatforeach($cookies AS $v){    foreach ($v  AS $k1 => $v1){        $tmp[$k1]=$v1;    }}$cookies = $tmp;print_r($cookies);