1. 程式人生 > >php curl的作用及用法

php curl的作用及用法

curl 模擬瀏覽器請求,比如獲取遠端瀏覽器內容,雖然可以用file_get-contents來代替,但curl還支援瀏覽器型別,cookie和來源ip等,功能相比強大

常用相關函式

curl_init()   初始化curl會話

curl_setopt() 設定curl傳輸選項

curl_exec  執行curl會話

curl_errno 返回最後一次的錯誤程式碼

curl_error 返回當前會話嘴週一次錯誤的字串

curl_close  關閉curl會話

function getCurl($url,$cookie = null,$post_data = null,$miao = null){

	$ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	
	
	if($cookie)
	{
		
		if($cookie =='auto')
		{
			$cookie_string = '';
			$_COOKIE['user_id'] = 12;
			foreach($_COOKIE as $key=>$val)
			{
				$cookie_string .= $key.'='.$val.';';
			}
			curl_setopt($ch, CURLOPT_COOKIE,$cookie_string);
		}
		elseif(is_array($cookie) && $cookie['type']=='cookie_file')
		{
			//echo $cookie['value'];
			curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie['value']);
			curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie['value']);
		}
		else
		{
			curl_setopt($ch, CURLOPT_COOKIE,$cookie);
		}
	}
	if($post_data)
	{
		curl_setopt($ch, CURLOPT_POST, 1);

		// 把post的變數加上

		curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
	}
	
	//判斷超時處理
	if(!empty($miao)){
		curl_setopt($ch, CURLOPT_NOSIGNAL, 1);    //注意,毫秒超時一定要設定這個
		curl_setopt($ch, CURLOPT_TIMEOUT_MS, $miao);  //超時毫秒,cURL 7.16.2中被加入。從PHP 5.2.3起可使用	
		$head = curl_exec($ch);
		$curl_errno = curl_errno($ch);
		$curl_error = curl_error($ch);
		if($curl_errno>0){
			$head = '2';
		}else{
			$head = $head;
		}
	}else{
		$head = curl_exec($ch);
	}



    //$head = curl_exec($ch);
    //echo $url;echo 'bb';var_dump($head);exit;
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch); 
	return $head;
}

該方法相比於file_get_contents最大的不同,就是可以將遠端的cookie資訊也獲得過來,這種情況適合於跨站的登入資訊的同步。比如你在www.demo.com下登入,然後到music.demo.com下應該也會是登入狀態,那怎樣實現這種情況呢?

在www下登入成功之後,將cookie資訊保留一份,然後在music下通過curl方式獲得cookie資訊,因為cookie相對來說不安全,所以在www下可以不把重要資訊放到cookie中而只把標誌使用者登入的資訊放入其中,比如使用者id,到了music中,使用者通過id在進行登入即可,仍然將使用者資訊取出進行登入的操作。

那麼問題來了了,既然在www下登入了在music也是登入狀態,那在music下登入了在www下也應該是登入狀態的,在其他子站下應該也是登入狀態的,所以,對於有多個子站的情況,我們應該講使用者登入資訊的處理放在一個公共的站點下面。每次都通過這裡來操作,而且,登入後的使用者資訊應該放到memcached等快取中,因為很明顯登入操作是一個操作頻繁的動作,應該減少使用者頻繁讀取資料庫帶來的壓力。