$Data?=?array('user'?=?'xiaoming');
創(chuàng)新互聯(lián)公司從2013年成立,先為龍川等服務建站,龍川等地企業(yè),進行企業(yè)商務咨詢服務。為龍川企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
$ch?=?curl_init();
curl_setopt($ch,CURLOPT_URL,'');
curl_setopt($ch,?CURLOPT_HEADER,?0);
curl_setopt($ch,?CURLOPT_RETURNTRANSFER,?1);
curl_setopt($ch,?CURLOPT_POST,?1);
curl_setopt($ch,?CURLOPT_POSTFIELDS,?$Data);
$a?=?curl_exec($ch);
curl_close($ch);
print_r(?$a?);
給你個我寫的curl方法。
/**
*?curl模擬提交
*?@param string $url 網(wǎng)址
*?@param array/string $opt 提交參數(shù)
*?@param string $header 取回的頭信息
*?@param string $redirect 是否重定向
*?@param boolean $ssl 驗證https證書
*?@return [type] 返回信息
*/
function?curl($url,?$opt='GET',?$header=null,?$redirect=true,?$ssl=false){
//初始化
$ch?=?curl_init($url);
//配置設置
curl_setopt($ch,?CURLOPT_SSL_VERIFYPEER,?$ssl);
curl_setopt($ch,?CURLOPT_SSL_VERIFYHOST,?$ssl);
curl_setopt($ch,?CURLOPT_FOLLOWLOCATION,?$redirect);
curl_setopt($ch,?CURLOPT_RETURNTRANSFER,?true); #返回結(jié)果
curl_setopt($ch,?CURLOPT_HEADER,?true); #顯示協(xié)議頭
if(is_array($opt)){
//轉(zhuǎn)小寫
$opt?=?array_change_key_case($opt,?CASE_LOWER);
//POST
if(isset($opt['type'])??strtoupper($opt['type'])=='POST'){
curl_setopt($ch,?CURLOPT_POST,?true);
curl_setopt($ch,?CURLOPT_POSTFIELDS,?(isset($opt['data'])???$opt['data']?:?''));
}
//User-Agent
if(array_key_exists('ua',?$opt))
curl_setopt($ch,?CURLOPT_USERAGENT,?$opt['ua']);
//Header
if(array_key_exists('header',?$opt)){
curl_setopt($ch,?CURLOPT_HTTPHEADER,?(array)$opt['header']);
}
//Cookie
if(array_key_exists('cookie',?$opt))
curl_setopt($ch,?CURLOPT_COOKIE,?$opt['cookie']);
//Referer
if(array_key_exists('referer',?$opt))
curl_setopt($ch,?CURLOPT_REFERER,?$opt['referer']);
}else{
//僅POST
if(strtoupper((string)$opt)?==?'POST')
curl_setopt($ch,?CURLOPT_POST,?true);
}
$result?=?curl_exec($ch);
if(curl_errno($ch)){
$result?=?curl_error($ch);
}else{
//獲取頭長度
$length?=?curl_getinfo($ch,?CURLINFO_HEADER_SIZE);
//取出頭信息
$header?=?substr($result,?0,?$length);
//去掉頭信息
$result?=?substr($result,?$length);
}
//釋放
curl_close($ch);
return?$result;
}
php的multi_curl功能慎用 因為某些版本的curl和php的搭配有Bug 所以你調(diào)試過沒問題的代碼很可能在別的機器上不正確 ?
相信許多人對php手冊中語焉不詳?shù)腸url_multi一族的函數(shù)頭疼不已 它們文檔少 給的例子 更是簡單的讓你無從借鑒 我也曾經(jīng)找了許多網(wǎng)頁 都沒見一個完整的應用例子 ?curl_multi_add_handle ?curl_multi_close ?curl_multi_exec ?curl_multi_getcontent ?curl_multi_info_read ?curl_multi_init ?curl_multi_remove_handle ?curl_multi_select 一般來說 想到要用這些函數(shù)時 目的顯然應該是要同時請求多個url 而不是一個一個依次請求 否則不如自己循環(huán)去調(diào)curl_exec好了
步驟總結(jié)如下 第一步 調(diào)用curl_multi_init 第二步 循環(huán)調(diào)用curl_multi_add_handle 這一步需要注意的是 curl_multi_add_handle的第二個參數(shù)是由curl_init而來的子handle 第三步 持續(xù)調(diào)用curl_multi_exec 第四步 根據(jù)需要循環(huán)調(diào)用curl_multi_getcontent獲取結(jié)果 第五步 調(diào)用curl_multi_remove_handle 并為每個字handle調(diào)用curl_close 第六步 調(diào)用curl_multi_close 這里有一個網(wǎng)上找的簡單例子 其作者稱為dirty的例子 (稍后我會說明為何dirty)
復制代碼 代碼如下: * Here s a quick and dirty example for curl multi from PHP tested on PHP RC CLI / FreeBSD */
$connomains = array( " " " );
$mh = curl_multi_init();
foreach ($connomains as $i = $url) { ???? $conn[$i]=curl_init($url); ????? curl_setopt($conn[$i] CURLOPT_RETURNTRANSFER ); ????? curl_multi_add_handle ($mh $conn[$i]); }
do { $n=curl_multi_exec($mh $active); } while ($active);
foreach ($connomains as $i = $url) { ????? $res[$i]=curl_multi_getcontent($conn[$i]); ????? curl_close($conn[$i]); }
print_r($res);
整個使用過程差不多就是這樣 但是 這個簡單代碼有個致命弱點 就是在do循環(huán)的那段 在整個url請求期間是個死循環(huán) 它會輕易導致CPU占用 % 現(xiàn)在我們來改進它 這里要用到一個幾乎沒有任何文檔的函數(shù)curl_multi_select了 雖然C的curl庫對select有說明 但是 php里的接口和用法確與C中有不同 把上面do的那段改成下面這樣
復制代碼 代碼如下: do { ??????????????????????? $mrc = curl_multi_exec($mh $active); ??????????????? } while ($mrc == CURLM_CALL_MULTI_PERFORM); ??????????????? while ($active and $mrc == CURLM_OK) { ??????????????????????? if (curl_multi_select($mh) != ) { ??????????????????????????????? do { ??????????????????????????????????????? $mrc = curl_multi_exec($mh $active); ??????????????????????????????? } while ($mrc == CURLM_CALL_MULTI_PERFORM); ??????????????????????? } ??????????????? }
因 為$active要等全部url數(shù)據(jù)接受完畢才變成false 所以這里用到了curl_multi_exec的返回值判斷是否還有數(shù)據(jù) 當有數(shù)據(jù)的時候 就不停調(diào)用curl_multi_exec 暫時沒有數(shù)據(jù)就進入select階段 新數(shù)據(jù)一來就可以被喚醒繼續(xù)執(zhí)行 這里的好處就是CPU的無謂消耗沒有 了
另外 還有一些細節(jié)的地方可能有時候要遇到 控制每一個請求的超時時間 在curl_multi_add_handle之前通過curl_setopt去做 curl_setopt($ch CURLOPT_TIMEOUT $timeout);
判斷是否超時了或者其他錯誤 在curl_multi_getcontent之前用 curl_error($conn[$i]);
lishixinzhi/Article/program/PHP/201311/21124
一、使用curl調(diào)用遠程PHP文件來獲取相應數(shù)據(jù)
二、問題
調(diào)用遠程的PHP文件后,print_r($result)死活打印不出來東西。
三、解決
原來是自己在遠程PHP文件中使用了return返回json數(shù)據(jù),改為了echo 后就可以了
害我浪費了幾個小時時間,記錄一下。