将Cookie存储在数据库

时间:2017-02-11 18:31:47

标签: php curl cookies amazon-dynamodb

传统上,人们会通过

指定一个cookie文件/ jar
curl_setopt($ch,CURLOPT_COOKIEJAR,$file);
curl_setopt($ch,CURLOPT_COOKIEFILE,$file);

由于我想从多个服务器访问该cookie,我想将cookie存储在数据库中。

现在我知道我可以使用

设置cookie
curl_setopt($ch,CURLOPT_COOKIE,$file);

因此从数据库设置cookie没有问题。

对我来说,问题是获得最终的cookie并将它们与现有的cookie混合。

有解决方案解析Set-Cookie:标头的http标头并返回该标头。

通过仅使用要设置的新cookie更新数据库,我将丢失现有的cookie。

有解决方案吗?它可能正在努力拥有一个连接到数据库的处理程序,其行为类似于卷曲或编码PHP中的cookie处理程序,用于合并新的和现有的cookie。

我希望cookie能够使用很长时间,而不仅仅是登录x来获取y并完成。

1 个答案:

答案 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字段。

保存Cookie代码

$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。现有键值已更新或保持不变。

存储Cookie的副本

将cookies []转换为json,然后存储在数据库记录或文本文件的文本字段中。

$json = json_encode($cookies);
file_put_contents('cookieJar.jsn',$json);

再次需要时检索。

$json = file_get_contents('cookieJar.jsn');
$cookies = json_decode($json,true);

在下一个请求中发送cookies []

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

-