小蒋同学 - 正则
type: channel
link: https://www.eybk.cn/tag/%E6%AD%A3%E5%88%99/
items: PHP 使用 CURL 不依赖 COOKIEJAR 获取 COOKIE 的方法

PHP 使用 CURL 不依赖 COOKIEJAR 获取 COOKIE 的方法
type: item
date: 2019-11-12T19:25:00+08:00
description: 使用 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]);