本文目錄一覽:
curl命令在PHP中怎麼用
這是我項目中一直在用的一個方法
?php
function curl($url,$params = array(),$header = array(),$timeout = 180){
if(empty($url)) return $url;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$url);//請求url地址
curl_setopt($curl, CURLOPT_HTTPHEADER , $header ); //構造IP
if(!empty($params) count($params) 0){
curl_setopt($curl, CURLOPT_POST, true);
//Request Payload格式數據
if(isset($params[‘is_json’]) $params[‘is_json’] === true){
unset($params[‘is_json’]);
$params = json_encode($params);
}else{
$params = http_build_query($params);
}
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
}
//curl_setopt($curl, CURLOPT_HEADER, true);//是否返迴響應頭信息
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//是否將結果返回
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);//是否重定向
//curl_setopt($curl, CURLOPT_USERAGENT, ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36’);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 只信任CA頒布的證書
//curl_setopt($curl, CURLOPT_CAINFO, $cacert); // CA根證書(用來驗證的網站證書是否是CA頒布)
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 檢查證書中是否設置域名,並且是否與提供的主機名匹配
// 從證書中檢查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
//curl_setopt($curl, CURLOPT_HTTPHEADER, array(“Expect: “));
curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);//用來告訴PHP腳本在成功連接服務器前等待多久(連接成功之後就會開始緩衝輸出),這個參數是為了應對目標服務器的過載,下線,或者崩潰等可能狀況;
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);//用來告訴成功PHP腳本,從服務器接收緩衝完成前需要等待多長時間。如果目標是個巨大的文件,生成內容速度過慢或者鏈路速度過慢,這個參數就會很有用。
// 自動設置Referer
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
//curl_setopt($curl, CURLOPT_COOKIEJAR, “D:phpStudyWWWcjcooBE66.tmp”);// //寫入cookie信息
//setcookie(‘cookie_jar’, $cookie_jar); //保存cookie路徑
$data = curl_exec($curl); //執行
curl_close($curl);
return $data;
}
?
PHP中的curl_exec
curl_exec
(PHP 4 = 4.0.2, PHP 5) curl_exec — 執行一個cURL會話
可以參考官方網站範例:
你要用CURL,就跟Session一樣,要先初始化 curl_init(),不然PHP部會知道該怎麼運作。初始化完成之後就要開始設定參數,就像是要不要顯示出來。當你參數設定完畢,就要開始執行這個CURL。最後就要關閉這個CURL。這就算是一個簡單的CURL運用,當然還有更多變化。
實際例子:
?php
// 創建一個cURL資源
$ch = curl_init();
// 設置URL和相應的選項
curl_setopt($ch, CURLOPT_URL, “
);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 抓取URL並把它傳遞給瀏覽器
curl_exec($ch);
// 關閉cURL資源,並且釋放系統資源
curl_close($ch);
?
如使用mysql一樣,首先,我們必須先建立一個「curl」的連線,也因此,必須使用到 curl_init() 這個函式。而為了怕建立連線忘了關閉。因此,必須先寫好關閉的函式,curl_close($ch)。
不過大部分HTML標籤都可以抓下來,並且顯示,可是有部分可能與資料加密性或是轉址的部分,就無法正常顯示。
/ 建立CURL連線
$ch = curl_init();
// 設定擷取的URL網址
curl_setopt($ch, CURLOPT_URL, “
);
curl_setopt($ch, CURLOPT_HEADER, false);
//將curl_exec()獲取的訊息以文件流的形式返回,而不是直接輸出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// 執行
$temp=curl_exec($ch);
// 關閉CURL連線
curl_close($ch)
加上curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);之後,他會將curl_exec()獲取的訊息以文件流的形式返回傳給$temp,而不是直接輸出。如果要顯示出畫面的話就加上 echo $temp;就可以了。
下面先分享一個比較常用的,傳遞參數的部分。
簡易的使用語法(GET):
// 建立CURL連線
$ch = curl_init();
// 設定擷取的URL網址
curl_setopt($ch, CURLOPT_URL, “
);
curl_setopt($ch, CURLOPT_HEADER, false);
//將curl_exec()獲取的訊息以文件流的形式返回,而不是直接輸出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// 執行
$temp=curl_exec($ch);
// 關閉CURL連線
curl_close($ch)
Get參數可以直接在網址傳遞例如網址後面加的?SomeVar=test,但是一旦資料量很大,用POST送還是比較適合。
簡易的使用語法(POST):
// 建立CURL連線
$ch = curl_init();
// 設定擷取的URL網址
curl_setopt($ch, CURLOPT_URL, “
);
curl_setopt($ch, CURLOPT_HEADER, false);
//將curl_exec()獲取的訊息以文件流的形式返回,而不是直接輸出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
//設定要傳的 變數A=值A 變數B=值B (中間要用符號串接)
$PostData = “a=abcb=def”;
//設定CURLOPT_POST 為 1或true,表示要用POST方式傳遞
curl_setopt($ch, CURLOPT_POST, 1);
//CURLOPT_POSTFIELDS 後面則是要傳接的POST資料。
curl_setopt($ch, CURLOPT_POSTFIELDS, $PostData);
// 執行
$temp=curl_exec($ch);
// 關閉CURL連線
curl_close($ch)
以上的傳遞方式在某些狀況下很好用,譬如說,沒有設計完整的會員申請系統,就可以利用上面這些程式碼,做一個自動註冊申請機
php curl 應用有哪些
curl_close — 關閉一個curl會話
curl_copy_handle — 拷貝一個curl連接資源的所有內容和參數
curl_errno — 返回一個包含當前會話錯誤信息的數字編號
curl_error — 返回一個包含當前會話錯誤信息的字符串
curl_exec — 執行一個curl會話
curl_getinfo — 獲取一個curl連接資源句柄的信息
curl_init — 初始化一個curl會話
curl_multi_add_handle — 向curl批處理會話中添加單獨的curl句柄資源
curl_multi_close — 關閉一個批處理句柄資源
curl_multi_exec — 解析一個curl批處理句柄
curl_multi_getcontent — 返回獲取的輸出的文本流
curl_multi_info_read — 獲取當前解析的curl的相關傳輸信息
curl_multi_init — 初始化一個curl批處理句柄資源
curl_multi_remove_handle — 移除curl批處理句柄資源中的某個句柄資源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be “selected”
curl_setopt_array — 以數組的形式為一個curl設置會話參數
curl_setopt — 為一個curl設置會話參數
curl_version — 獲取curl相關的版本信息
curl_init()函數的作用初始化一個curl會話,curl_init()函數唯一的一個參數是可選的,表示一個url地址。
curl_exec()函數的作用是執行一個curl會話,唯一的參數是curl_init()函數返回的句柄。
curl_close()函數的作用是關閉一個curl會話,唯一的參數是curl_init()函數返回的句柄。
前段時間一直在用PHP寫些小程序, 為此接觸了Curl這個類. 感覺非常的強大, 在此把我遇到的一些功能記錄下來;
php curl的幾種用法
總結一下項目中用到curl的幾種方式1. php curl的默認調用方法,get方式訪問url$ch = curl_init();curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //設置http頭curl_setopt($ch, CURLOPT_ENCODING, “gzip” ); //設置為客戶端支持gzip壓縮curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30 ); //設置連接等待時間curl_setopt($ch, CURLOPT_URL, $url );curl_exec( $ch );if ($error = curl_error($ch) ) {//出錯處理return -1;}fclose($fp);$curl_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //獲取http返回值if( $curl_code == 200 ) {//正常訪問url}//異常2. 設置http header支持curl訪問lighttpd服務器Java代碼$header[]= ‘Expect:’;$header[]= ‘Expect:’;3. 設置curl,只獲取http header,不獲取body:Java代碼curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_NOBODY, 1);curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_NOBODY, 1);或者只獲取body:Java代碼curl_setopt($ch, CURLOPT_HEADER, 0); // make sure we get the bodycurl_setopt($ch, CURLOPT_NOBODY, 0);curl_setopt($ch, CURLOPT_HEADER, 0); // make sure we get the bodycurl_setopt($ch, CURLOPT_NOBODY, 0);4. 訪問虛擬主機,需設置Host$header[]= ‘Host: ‘.$host;5. 使用post, put, delete等REStful方式訪問urlpost:curl_setopt($ch, CURLOPT_POST, 1 );put, delete:curl_setopt($ch, CURLOPT_CUSTOMREQUEST, “DELETE”); //或者PUT,需要服務器支持這些方法。6. 保存下載內容為文件
php curl 模擬登錄並獲取數據實例詳解
PHP的curl()在抓取網頁的效率方面是比較高的,而且支持多線程,而file_get_contents()效率就要稍低些,當然,使用curl時需要開啟下curl擴展。
代碼實戰
先來看登錄部分的代碼:
//模擬登錄
function
login_post($url,
$cookie,
$post)
{
$curl
=
curl_init();//初始化curl模塊
curl_setopt($curl,
CURLOPT_URL,
$url);//登錄提交的地址
curl_setopt($curl,
CURLOPT_HEADER,
0);//是否顯示頭信息
curl_setopt($curl,
CURLOPT_RETURNTRANSFER,
0);//是否自動顯示返回的信息
curl_setopt($curl,
CURLOPT_COOKIEJAR,
$cookie);
//設置Cookie信息保存在指定的文件中
curl_setopt($curl,
CURLOPT_POST,
1);//post方式提交
curl_setopt($curl,
CURLOPT_POSTFIELDS,
http_build_query($post));//要提交的信息
curl_exec($curl);//執行cURL
curl_close($curl);//關閉cURL資源,並且釋放系統資源
}
函數login_post()首先初始化curl_init(),然後使用curl_setopt()設置相關選項信息,包括要提交的url地址,保存的cookie文件,post的數據(用戶名和密碼等信息),是否返回信息等等,然後curl_exec執行curl,最後curl_close()釋放資源。注意PHP自帶的http_build_query()可以將數組轉換成相連接的字符串。
接下來如果登錄成功後,我們要獲取登錄成功後的頁面信息。
//登錄成功後獲取數據
function
get_content($url,
$cookie)
{
$ch
=
curl_init();
curl_setopt($ch,
CURLOPT_URL,
$url);
curl_setopt($ch,
CURLOPT_HEADER,
0);
curl_setopt($ch,
CURLOPT_RETURNTRANSFER,
1);
curl_setopt($ch,
CURLOPT_COOKIEFILE,
$cookie);
//讀取cookie
$rs
=
curl_exec($ch);
//執行cURL抓取頁面內容
curl_close($ch);
return
$rs;
}
函數get_content()中也是先初始化curl,然後設置相關選項,執行curl,釋放資源。其中我們設置CURLOPT_RETURNTRANSFER為1即自動返回信息,而CURLOPT_COOKIEFILE可以讀取到登錄時保存的cookie信息,最後將頁面內容返回。
我們的最終目的是要獲取到模擬登錄後的信息,也就是只有正常登錄成功後才能獲取的有用信息。接下來我們以登錄開源中國的移動版為例,看看如何抓取到登錄成功後的信息。
//設置post的數據
$post
=
array
(
’email’
=
‘oschina賬戶’,
‘pwd’
=
‘oschina密碼’,
‘goto_page’
=
‘/my’,
‘error_page’
=
‘/login’,
‘save_login’
=
‘1’,
‘submit’
=
‘現在登錄’
);
//登錄地址
$url
=
“”;
//設置cookie保存路徑
$cookie
=
dirname(__FILE__)
.
‘/cookie_oschina.txt’;
//登錄後要獲取信息的地址
$url2
=
“”;
//模擬登錄
login_post($url,
$cookie,
$post);
//獲取登錄頁的信息
$content
=
get_content($url2,
$cookie);
//刪除cookie文件
@
unlink($cookie);
//匹配頁面信息
$preg
=
“/td
class=’portrait'(.*)\/td/i”;
preg_match_all($preg,
$content,
$arr);
$str
=
$arr[1][0];
//輸出內容
echo
$str;
使用總結
1、初始化curl;
2、使用curl_setopt設置目標url,和其他選項;
3、curl_exec,執行curl;
4、執行後,關閉curl;
5、輸出數據。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238138.html