最近特發奇想做個curl的網頁應用,多用戶操作的話,在不把cookies寫到文件中的需求下,如何保存他們登陸的cookies和獲取他們的cookies進行下一步的curl操作?
我想過以下方案:
保存到memcache中,用sessionid作為memcache的key,(不知這方案可行不)
最近特發奇想做個curl的網頁應用,多用戶操作的話,在不把cookies寫到文件中的需求下,如何保存他們登陸的cookies和獲取他們的cookies進行下一步的curl操作?
我想過以下方案:
保存到memcache中,用sessionid作為memcache的key,(不知這方案可行不)
猜你是因為模擬登陸後,無法保存用戶的會話狀態.其實有兩種解決方案.一是將其保存在文件中.這樣會執行兩次的IO操作,對性能要求不是特別好.二是將其cookie值保存在session或是其他的高速緩存中.但是要求就是原網站的response返回的響應頭必須要有set-cookie這項.話不多說,直接上一串代碼.
<code>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; //页面所得到的数据 }</code>