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