php 用curl模拟登陆后 如果多用户的话操作 如何保存他们登陆的cookies?不写文件的情况下
程序员文章站
2023-12-25 07:59:39
...
最近特发奇想想做个curl的网页应用,多用户操作的话,在不把cookies写到文件中的需求下,如何保存他们登陆的cookies和获取他们的cookies进行下一步的curl操作?
我想过以下方案:
保存到memcache中,用sessionid作为memcache的key,(不知这方案可行不)
我想过以下方案:
保存到memcache中,用sessionid作为memcache的key,(不知这方案可行不)
回复内容:
最近特发奇想想做个curl的网页应用,多用户操作的话,在不把cookies写到文件中的需求下,如何保存他们登陆的cookies和获取他们的cookies进行下一步的curl操作?
我想过以下方案:
保存到memcache中,用sessionid作为memcache的key,(不知这方案可行不)
猜你是因为模拟登陆后,无法保存用户的会话状态.其实有两种解决方案.一是将其保存在文件中.这样会执行两次的IO操作,对性能要求不是特别好.二是将其cookie值保存在session或者是其他的高速缓存中.但是要求就是原网站的response返回的响应头必须要有set-cookie这项.话不多说,直接上一串代码.
function curlFetch($url, $data = null ,$referer = ""){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回字符串,而非直接输出
curl_setopt($ch, CURLOPT_HEADER, 1); // 返回header部分
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // 设置socket连接超时时间
if (!empty($referer))
{
curl_setopt($ch, CURLOPT_REFERER, $referer); // 设置引用网址
}
$cookie_str=session('servlet');
if(!empty($cookie_str)){
curl_setopt($ch, CURLOPT_COOKIE , $cookie_str);
}
if (is_null($data))
{
// GET
}
else if (is_string($data))
{
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// POST
}
else if (is_array($data))
{
// POST
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
}
set_time_limit(120); // 设置自己服务器超时时间
$str = curl_exec($ch);
curl_close($ch);
list($header, $body) = explode("\r\n\r\n", $str);
// 解析COOKIE
preg_match("/Set-Cookie:(.*);/iU", $header, $matches);
if(!empty($matches) && empty($cookie_str)){
$cookies=$matches[1]; //这里是你需要保存cookie
session('servlet',$cookies); //我这里将其保存在session中
}
return $body; //页面所得到的数据
}