欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php 用curl模拟登陆后 如果多用户的话操作 如何保存他们登陆的cookies?不写文件的情况下

程序员文章站 2022-05-29 11:56:07
...
最近特发奇想想做个curl的网页应用,多用户操作的话,在不把cookies写到文件中的需求下,如何保存他们登陆的cookies和获取他们的cookies进行下一步的curl操作?
我想过以下方案:
保存到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;    //页面所得到的数据
}
相关标签: php curl