传统上,人们会通过
指定一个cookie文件/ jarcurl_setopt($ch,CURLOPT_COOKIEJAR,$file);
curl_setopt($ch,CURLOPT_COOKIEFILE,$file);
由于我想从多个服务器访问该cookie,我想将cookie存储在数据库中。
现在我知道我可以使用
设置cookiecurl_setopt($ch,CURLOPT_COOKIE,$file);
因此从数据库设置cookie没有问题。
对我来说,问题是获得最终的cookie并将它们与现有的cookie混合。
有解决方案解析Set-Cookie:
标头的http标头并返回该标头。
通过仅使用要设置的新cookie更新数据库,我将丢失现有的cookie。
有解决方案吗?它可能正在努力拥有一个连接到数据库的处理程序,其行为类似于卷曲或编码PHP中的cookie处理程序,用于合并新的和现有的cookie。
我希望cookie能够使用很长时间,而不仅仅是登录x来获取y并完成。
答案 0 :(得分:0)
我多年来一直在做的是从HTTP响应标题中收集和保存cookie。
然后在后续的HTTP请求中使用它们。
Cookie是键值对,因此通过使用数组,旧Cookie将被保留,自动更新,并添加新Cookie。
首先要告诉curl返回HTTP响应头(cookie所在的位置)
curl_setopt($ch, CURLOPT_HEADER, true);
然后将响应头与HTTP响应分开。为此,我们必须首先获得响应头大小。
$data = curl_exec($ch);
$skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE));
然后使用子字符串从响应中分割标题。
$head = substr($data,0,$skip);
$data = substr($data,$skip);
接下来从$head
中存储的HTTP标头中检索Cookie
每个cookie都以'Set-Cookie:'开头
我们使用strpos()来查找第一次出现Set-Cookie的位置:然后是每个后续的Set-Cookie:
$ e是cookie标记的结尾$ s是cookie标记的开头。一个标记是$ head中找到每个cookie的位置。
最初,Cookie标记$e
的结尾为零,因此找到第一次出现'Set-Cookie'的位置。
$e = 0;
$s = strpos($head,'Set-Cookie: ',$e);
我们必须将字符串'Set-Cookie:'的长度(12)添加到$ s,它被strpos()
设置为此字符串位置中第一个字符'S'的位置。实际的cookie紧跟在'Set-Cookie:'
$s += 12;
cookie以分号结束,因此我们将$ e结束位置标记设置为cookie结尾的位置。
我们开始在$ s开始位置标记之后查找分号,方法是使用$ s作为strpos()
开始搜索的起始位置。
$e = strpos($head,';',$s);
现在我们有cookie的开始和结束位置。
Cookie的键值对格式为:key = value
所以我们将cookie分成等号。
$s = strpos($cookie,'=');
$key = substr($cookie,0,$s);
$value = substr($cookie,$s);
然后我们将每个cookie存储在一个数组中。将数组转换为json并将其作为文本保存为文本文件或数据库记录中的Text字段。
$data = curl_exec($ch);
$skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE));
$head = substr($data,0,$skip);
$data = substr($data,$skip);
$e = 0;
while(true){
$s = strpos($head,'Set-Cookie: ',$e);
if (!$s){break;} // no more Set-Cookie: found
$s += 12;
$e = strpos($head,';',$s);
$cookie = substr($head,$s,$e-$s) ;
$s = strpos($cookie,'=');
$key = substr($cookie,0,$s);
$value = substr($cookie,$s);
$cookies[$key] = $value;
}
请记住,我们会添加新的Cookie。现有键值已更新或保持不变。
将cookies []转换为json,然后存储在数据库记录或文本文件的文本字段中。
$json = json_encode($cookies);
file_put_contents('cookieJar.jsn',$json);
再次需要时检索。
$json = file_get_contents('cookieJar.jsn');
$cookies = json_decode($json,true);
$cookie = '';
foreach ($cookies as $key => $value){ // loop through array getting each key value pair
$cookie .= "$k=$v; ";
}
rtrim($cookie,'; '); // curl does not want the last terminating semi-colon.
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIE, $cookie );
-