許多年前的代碼突然拿來一用,特做此筆記(此處的code用來定位內部錯誤位置,非http code)
<?php $url="http://c.hiphotos.baidu.com/image/w%3D210/sign=ed30880babec8a13141a50e1c7029157/d52a2834349b033be1a9503e17ce36d3d539bd35.gif";function curl_url($url,$type=0,$timeout=30){$msg = ['code'=>2100,'status'=>'error','msg'=>'未知錯誤。'];$imgs= ['image/jpeg'=>'jpeg', 'image/jpg'=>'jpg', 'image/gif'=>'gif', 'image/png'=>'png', 'text/html'=>'html', 'text/plain'=>'txt', 'image/pjpeg'=>'jpg', 'image/x-png'=>'png', 'image/x-icon'=>'ico' ];if(!stristr($url,'http')){$msg['code']= 2101;$msg['msg'] = 'url地址不正確!';return $msg;}$dir= pathinfo($url);//var_dump($dir);$host = $dir['dirname'];$refer= $host.'/';$ch = curl_init($url);curl_setopt ($ch, CURLOPT_REFERER, $refer); //偽造來源地址curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//返回變數內容還是直接輸出字串,0輸出,1返回內容curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);//在啟用CURLOPT_RETURNTRANSFER的時候,返回原生的(Raw)輸出curl_setopt($ch, CURLOPT_HEADER, 0); //是否輸出HEADER頭資訊 0否1是curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //逾時時間$data = curl_exec($ch);//$httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE); //$httpContentType = curl_getinfo($ch,CURLINFO_CONTENT_TYPE);$info = curl_getinfo($ch);curl_close($ch);$httpCode = intval($info['http_code']);$httpContentType = $info['content_type'];$httpSizeDownload= intval($info['size_download']);if($httpCode!='200'){$msg['code']= 2102;$msg['msg'] = 'url返回內容不正確。';return $msg;}if($type>0 && !isset($imgs[$httpContentType])){$msg['code']= 2103;$msg['msg'] = 'url資源類型未知。';return $msg;}if($httpSizeDownload<1){$msg['code']= 2104;$msg['msg'] = '內容大小不正確。';return $msg;}$msg['code'] = 200;$msg['status']='success'; $msg['msg'] = '資源擷取成功';if($type==0 or $httpContentType=='text/html') $msg['data'] = $data;$base_64 = base64_encode($data);if($type==1) $msg['data'] = $base_64;elseif($type==2) $msg['data'] = "data:{$httpContentType};base64,{$base_64}";elseif($type==3) $msg['data'] = "<img src='data:{$httpContentType};base64,{$base_64}' />";else $msg['msg'] = '未知返回需求。';unset($info,$data,$base_64);return $msg;}$msg = curl_url($url,3);if($msg['status']=='success') echo $msg['data'];die;?>
輸出效果如下:
下面是部分curl函數參數說明:
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_selectGet all the sockets associated with the cURL extension, which can then be "selected"curl_setopt_array以數組的形式為一個curl設定會話參數curl_setopt為一個curl設定會話參數curl_version擷取curl相關的版本資訊
curl_setopt()參數名稱說明CURLOPT_INFILESIZE當你上傳一個檔案到遠端站台,這個選項告訴PHP你上傳檔案的大小。CURLOPT_VERBOSE如果你想CURL報告每一件意外的事情,設定這個選項為一個非零值。CURLOPT_HEADER如果你想把一個頭包含在輸出中,設定這個選項為一個非零值。CURLOPT_NOPROGRESS如果你不會PHP為CURL傳輸顯示一個進程條,設定這個選項為一個非零值。注意:PHP自動化佈建這個選項為非零值,你應該僅僅為了調試的目的來改變這個選項。CURLOPT_NOBODY如果你不想在輸出中包含body部分,設定這個選項為一個非零值。CURLOPT_FAILONERROR如果你想讓PHP在發生錯誤(HTTP代碼返回大於等於300)時,不顯示,設定這個選項為一人非零值。預設行為是返回一個正常頁,忽略代碼。CURLOPT_UPLOAD如果你想讓PHP為上傳做準備,設定這個選項為一個非零值。CURLOPT_POST如果你想PHP去做一個正規的HTTP POST,設定這個選項為一個非零值。這個POST是普通的 application/x-www-from-urlencoded 類型,多數被HTML表單使用。CURLOPT_FTPLISTONLY設定這個選項為非零值,PHP將列出FTP的目錄名列表。CURLOPT_FTPAPPEND設定這個選項為一個非零值,PHP將應用遠程檔案代替覆蓋它。CURLOPT_NETRC設定這個選項為一個非零值,PHP將在你的 ~./netrc 檔案中尋找你要建立串連的遠端站台的使用者名稱及密碼。CURLOPT_FOLLOWLOCATION設定這個選項為一個非零值(象 “Location: “)的頭,伺服器會把它當做HTTP頭的一部分發送(注意這是遞迴的,PHP將發送形如 “Location: “的頭)。CURLOPT_PUT設定這個選項為一個非零值去用HTTP上傳一個檔案。要上傳這個檔案必須設定CURLOPT_INFILE和CURLOPT_INFILESIZE選項.CURLOPT_MUTE設定這個選項為一個非零值,PHP對於CURL函數將完全沉默。CURLOPT_TIMEOUT設定一個長整形數,作為最大延續多少秒。CURLOPT_LOW_SPEED_LIMIT設定一個長整形數,控制傳送多少位元組。CURLOPT_LOW_SPEED_TIME設定一個長整形數,控制多少秒傳送CURLOPT_LOW_SPEED_LIMIT規定的位元組數。CURLOPT_RESUME_FROM傳遞一個包含位元組位移地址的長整形參數,(你想轉移到的開始表單)。CURLOPT_SSLVERSION傳遞一個包含SSL版本的長參數。預設PHP將被它自己努力的確定,在更多的安全中你必須手工設定。CURLOPT_TIMECONDITION傳遞一個長參數,指定怎麼處理CURLOPT_TIMEVALUE參數。你可以設定這個參數為TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE。這僅用於HTTP。CURLOPT_TIMEVALUE傳遞一個從1970-1-1開始到現在的秒數。這個時間將被CURLOPT_TIMEVALUE選項作為指定值使用,或被預設TIMECOND_IFMODSINCE使用。CURLOPT_URL這是你想用PHP取回的URL地址。你也可以在用curl_init()函數初始化時設定這個選項。CURLOPT_USERPWD傳遞一個形如[username]:[password]風格的字串,作用PHP去串連。CURLOPT_PROXYUSERPWD傳遞一個形如[username]:[password] 格式的字串去串連HTTP代理。CURLOPT_RANGE傳遞一個你想指定的範圍。它應該是”X-Y”格式,X或Y是被除外的。HTTP傳送同樣支援幾個間隔,用逗句來分隔(X-Y,N-M)。CURLOPT_POSTFIELDS傳遞一個作為HTTP “POST”操作的所有資料的字串。CURLOPT_REFERER在HTTP請求中包含一個”referer”頭的字串。 CURLOPT_USERAGENT在HTTP請求中包含一個”user-agent”頭的字串。CURLOPT_FTPPORT傳遞一個包含被ftp “POST”指令使用的IP地址。這個POST指令告訴遠程伺服器去串連我們指定的IP地址。這個字串可以是一個IP地址,一個主機名稱,一個網路介面名(在UNIX下),或是‘-’(使用系統預設IP地址)。CURLOPT_COOKIE傳遞一個包含HTTP cookie的頭串連。CURLOPT_SSLCERT傳遞一個包含PEM格式認證的字串。CURLOPT_SSLCERTPASSWD傳遞一個包含使用CURLOPT_SSLCERT認證必需的密碼。CURLOPT_COOKIEFILE傳遞一個包含cookie資料的檔案的名字的字串。這個cookie檔案可以是Netscape格式,或是堆存在檔案中的HTTP風格的頭。CURLOPT_CUSTOMREQUEST當進行HTTP請求時,傳遞一個字元被GET或HEAD使用。為進行DELETE或其它操作是有益的,更Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing or another, more obscure, HTTP request. 注意: 在確認你的伺服器支援命令先不要去這樣做。下列的選項要求一個檔案描述(通過使用fopen()函數獲得)CURLOPT_FILE這個檔案將是你放置傳送的輸出檔案,預設是STDOUT.CURLOPT_INFILE這個檔案是你傳送過來的輸入檔案。CURLOPT_WRITEHEADER這個檔案寫有你輸出的頭部分。CURLOPT_STDERR這個檔案寫有錯誤而不是stderr。用來擷取需要登入的頁面的例子,當前做法是每次或許都登入一次,有需要的人再做改進了CURLOPT_AUTOREFERER自動化佈建header中的referer資訊CURLOPT_BINARYTRANSFER在啟用CURLOPT_RETURNTRANSFER時候將擷取資料返回CURLOPT_COOKIESESSION啟用時curl會僅僅傳遞一個session cookie,忽略其他的cookie,預設狀況下curl會將所有的cookie返回給服務端。session cookie是指那些用來判斷伺服器端的session是否有效而存在的cookie。CURLOPT_CRLF啟用時將Unix的分行符號轉換成斷行符號分行符號。CURLOPT_DNS_USE_GLOBAL_CACHE啟用時會啟用一個全域的DNS緩衝,此項為安全執行緒的,並且預設為true。CURLOPT_FAILONERROR顯示HTTP狀態代碼,預設行為是忽略編號小於等於400的HTTP資訊CURLOPT_FILETIME啟用時會嘗試修改遠程文檔中的資訊。結果資訊會通過curl_getinfo()函數的CURLINFO_FILETIME選項返回。CURLOPT_FOLLOWLOCATION啟用時會將伺服器伺服器返回的“Location:”放在header中遞迴的返回給伺服器,使用CURLOPT_MAXREDIRS可以限定遞迴返回的數量。CURLOPT_FORBID_REUSE在完成互動以後強迫中斷連線,不能重用。CURLOPT_FRESH_CONNECT強制擷取一個新的串連,替代緩衝中的串連。CURLOPT_HTTPGET啟用時會設定HTTP的method為GET,因為GET是預設是,所以只在被修改的情況下使用。CURLOPT_HTTPPROXYTUNNEL啟用時會通過HTTP代理來傳輸。CURLOPT_MUTE將curl函數中所有修改過的參數恢複預設值。CURLOPT_RETURNTRANSFER將curl_exec()擷取的資訊以檔案流的形式返回,而不是直接輸出。curl_getinfo()函數的作用是擷取一個curl串連資源控制代碼的資訊,curl_getinfo()函數有兩個參數,第一個參數是curl的資源控制代碼,第二個參數是下面一些常量:
curl_getinfo()參數名稱說明CURLINFO_EFFECTIVE_URL最後一個有效url地址CURLINFO_HTTP_CODE最後一個收到的HTTP代碼CURLINFO_FILETIME遠程擷取文檔的時間,如果無法擷取,則傳回值為“-1”CURLINFO_TOTAL_TIME最後一次傳輸所消耗的時間CURLINFO_NAMELOOKUP_TIME名稱解析所消耗的時間CURLINFO_CONNECT_TIME建立串連所消耗的時間CURLINFO_PRETRANSFER_TIME從建立串連到準備傳輸所使用的時間CURLINFO_STARTTRANSFER_TIME從建立串連到傳輸開始所使用的時間CURLINFO_REDIRECT_TIME在事務傳輸開始前重新導向所使用的時間CURLINFO_SIZE_UPLOAD上傳資料量的總值CURLINFO_SIZE_DOWNLOAD下載資料量的總值CURLINFO_SPEED_DOWNLOAD平均下載速度CURLINFO_SPEED_UPLOAD平均上傳速度CURLINFO_HEADER_SIZEheader部分的大小CURLINFO_HEADER_OUT發送請求的字串CURLINFO_REQUEST_SIZE在HTTP請求中有問題的請求的大小CURLINFO_SSL_VERIFYRESULTResult of SSL certification verification requested by setting CURLOPT_SSL_VERIFYPEERCURLINFO_CONTENT_LENGTH_DOWNLOAD從Content-Length: field中讀取的下載內容長度CURLINFO_CONTENT_LENGTH_UPLOAD上傳內容大小的說明CURLINFO_CONTENT_TYPE下載內容的“Content-type”值,NULL表示伺服器沒有發送有效“Content-Type: header”