使用 COOKIEJAR 方法
PHP 中 CURL 类在做请求时非常好用,对于COOKIE,CURL类也有很不错的支持。
获得 COOKIE 并存为文件:
// 把 COOKIE 保存至 cookie.txt
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
// COOKIE 文件存放在至 temp 文件夹下的随机文件
$cookie_file = tempnam('./temp','cookie');
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
读取文件并携带 COOKIE:
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
先把 COOKIE 保存文件,调用的时候再读取文件。
使用正则表达式
使用 COOKIEJAR 方法,会有两次 IO 操作,对效率有一定的损失。且运行在 BAE/SAE/GAE 等云计算平台时,不支持本地文件写入。使用正则表达式可以解决这些问题。
获取 COOKIE 解析为文本:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 获取头部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($ch);
curl_close($ch);
list($header, $body) = explode("\r\n\r\n", $content);
// 解析 COOKIE
preg_match("/Set-Cookie: (.*);/iU", $header, $matches);
$cookie = trim($matches[1]);
携带 COOKIE 文本提交:
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
返回多条 COOKIE 时的正则表达式:
很多时候,网站不止返回了一条 COOKIE,此时使用上面的代码匹配时无法匹配到完整的 COOKIE。对此,需要使用 preg_match_all 来进行匹配,代码如下:
preg_match("/Set-Cookie: (.*);/iU", $header, $matches);
$cookies = implode('; ', $matches[1]);