curl的簡單實用

2021-07-25 16:55:38 字數 2446 閱讀 3890

<?php 

// curl四部曲,複雜之處在於 設定選項 非常多 以下只是挑選個人常用的列出來

/*1.初始化         curl_init()

2.設定選項       curl_setopt()

3.執行並獲取結果 curl_exec()

4.釋放curl       curl_close()*/ 

//一.get方式實現

$ch = curl_init();

curl_setopt($ch,curlopt_url,$url);

curl_setopt($ch, curlopt_returntransfer, 1);//返回內容而不是直接輸出

curl_setopt($ch, curlopt_header, 0);// 如果你想把乙個頭包含在輸出中,設定這個選項為乙個非零值

curl_setopt( $ch, curlopt_connecttimeout , 60 );//表示60秒內沒有連線伺服器就會斷開連線,是連線伺服器前的等待時間

curl_setopt( $ch, curlopt_timeout , 60);//表示完成整個請求響應的過程需要的時間

$res = curl_exec($ch);

curl_close($ch);

//二.post方式實現,需要這兩句

curl_setopt( $ch , curlopt_post , true );

curl_setopt( $ch , curlopt_postfields , $params );//其中的$params是乙個陣列,如果不需要上傳檔案,可以對$params使用 http_build_query 處理,然後傳送

//三.帶有頭資訊的post請求傳送

function postrequest($url, $data, $header)

如果得到的$res是xml格式還需使用:******xml_load_string($res)處理

array ( [errcode] => 41005 [errmsg] => media data missing hint: [u.njma0968e547] )

2.不同版本php中curl的區別

php的curl支援通過給curl_postfields傳遞關聯陣列(而不是字串)來生成multipart/form-data的post請求。

傳統上,php的curl支援通過在陣列資料中,使用「@+絕對路徑」的語法附加檔案,供curl讀取上傳。

curl_setopt(ch, curlopt_postfields, array(

'file' => '@'.realpath('image.png'), 

)); 

equals

$ curl -f "file=@/absolute/path/to/image.png"

但php從5.5開始引入了新的curlfile類用來指向檔案。curlfile類也可以詳細定義mime型別、檔名等可能出現在multipart/form-data資料中的附加資訊。php推薦使用curlfile替代舊的@語法:

curl_setopt(ch, curlopt_postfields, [

'file' => new curlfile(realpath('image.png')), 

]); 

上面這段也是複製來的,但是我在自己的php5.6伺服器上使用curl_setopt ( $ch, curlopt_safe_upload, false);設定確實解決了問題,獲取了media_id;可能還與版本有關,待定...

判斷**如下:我們的實際需求其實是:有curlfile就優先採用,沒有再退化到傳統@語法。那麼**就來了:

if (class_exists('\curlfile')) else

if (class_exists('\curlfile')) else

}注意curl_setopt()的順序:

不管是curl_setopt()單發還是curl_setopt_array()批量,curl的選項總是設定乙個生效乙個,而設定好的選項立刻就會影響curl在設定後續選項時的行為。

例如curlopt_safe_upload就和curlopt_postfields的行為有關。如果先設定curlopt_postfields再設定curlopt_safe_upload,那麼後者的約束作用就不會生效。因為設定前者時curl就已經把資料實際的識讀處理完畢了!

curl有那麼幾個選項存在這種坑,務必小心。還好這種存在「依賴關係」的選項不多,機制也不複雜,簡單處理即可。我的方法是先批量設定所有的選項,然後直到curl_exec()的前一刻才用curl_setopt()單發設定curlopt_postfields。

實際上在curl_setopt_array()用的陣列中,保證curlopt_postfields的位置在後邊也是可靠的。php的關聯陣列是有順序保障的,我們也可以假設curl_setopt_array()內部的執行順序一定是從頭到尾按順序[注a],所以盡可放心。

curl的簡單使用

curl 是常用的命令列工具,用來請求 web 伺服器。它的名字就是客戶端 client 的 url 工具的意思。摘自 鏈結 1.1 如果想關閉進度條 process meter 和錯誤資訊 error message 可以使用 s,如果想只關閉進度條可以使用 ss,另外請求伺服器可能會被重定向到別...

curl簡單介紹

關於curl的介紹很多,這裡不詳細介紹,主要談一下簡單應用。最近研究了一下linux下的curl c api,最新版本為7.17,curl c api的文件比較豐富,唯一就是查詢起來,費些時間。curl的c api和curl的php api,函式介面和作用大致相同,所以如果有php api使用經驗應...

curl簡單介紹

關於 curl 的介紹很多,這裡不詳細介紹,主要談一下簡單應用。最近研究了一下 linux 下的curl c api 最新版本為 7.17 curl c api 的文件比較豐富,唯一就是查詢起來,費些時間。curl 的c api 和curl 的php api 函式介面和作用大致相同,所以如果有 ph...