PHP 使用 CURL 不依赖 COOKIEJAR 获取 COOKIE 的方法

warning: 这篇文章距离上次修改已过793天,其中的内容可能已经有所变动。

php.jpgphp.jpg

使用 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]);

添加新评论