Ⅰ php如何使用CURL復用連接
HTTP1.0與HTTP1.1的一個很大的差別是HTTP1.1支持長連接。現實中有很多這個場景,就是請求了一個頁面,然後這個頁面的其他內容,例如CSS文件,JS文件都要從同一個服務(相同伺服器,相同埠)上面獲取。這些向相同伺服器的請求如果能夠復用連接,是很有利於提供網路性能。
總的來說,復用HTTP連接有兩個好處:
1.節省系統埠資源(每一次連接都要使用埠,埠的資源是有限的)
2.節省創建socket連接的時間。
下面講講在PHP下面,如何使用CURL來復用連接:
curl是在一個handle裡面復用連接的,所以這樣就可以復用連接了:
$ch=curl_init();
$ret=curl_exec($ch);
......
$ret2=curl_exec($ch);
....
curl_close($ch);
在初始化跟關閉$ch資源時即可復用連接。
我這里寫了兩個函數,可以支持GET跟POST的請求,大家感興趣可以看看。
functioncurl_get($url,$timeout=5){
global$g_handle;
if(empty($g_handle))$ch=curl_init();
$options=array(
CURLOPT_URL=>$url,
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_FRESH_CONNECT=>false,
CURLOPT_FORBID_REUSE=>false,
CURLOPT_TIMEOUT=>$timeout
);
curl_setopt_array($g_handle,$options);
$ret=curl_exec($g_handle);
return$ret;
}
//可以支持POST數據,$post是一個數組,$timeout是超時時間。
functioncurl_post($url,$post=array(),$timeout=10){
global$g_handle;
if(empty($g_handle))$g_handle=curl_init();
$options=array(
CURLOPT_URL=>$url,
CURLOPT_POST=>true,
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_FRESH_CONNECT=>false,
CURLOPT_FORBID_REUSE=>false,
CURLOPT_TIMEOUT=>$timeout,
CURLOPT_POSTFIELDS=>http_build_query($post)
);
if(empty($post))$options[CURLOPT_POST]=false;
curl_setopt_array($g_handle,$options);
$ret=curl_exec($g_handle);
return$ret;
}
Ⅱ php curl 本地測試可用,線上測試報錯
<?php
/*****************************************************
程序名稱: curl使用測試
程序說明: 股票頁面信息獲取
編寫時間: 2011年2月12日
編寫人員: 童童
修改時間:
修改人員: 童童
備 注:
****************************************************/
$GPNumber = '000877';
$curlPost = 'gpdm=' . urlencode($GPNumber);
//初始化
$ch = curl_init();
//設置選項(直接設置或者通過數組設置)
//直接設置
//設置你需要抓取的URL
curl_setopt($ch, CURLOPT_URL, "http://www.shdjt.com/gpdm.asp");
//通過數組設置
/*
$options = array(
CURLOPT_URL => 'http://www..com/',
CURLOPT_HEADER => false
);
curl_setopt_array($ch, $options);
*/
// 設置header
curl_setopt($ch, CURLOPT_HEADER, 1);
// 設置cURL 參數,要求結果保存到字元串中還是輸出到屏幕上。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//設置使用POST方式
curl_setopt($ch, CURLOPT_POST, 1);
//設置POST數據
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
//執行並獲取HTML文檔內容
$str = curl_exec($ch);
//轉換編碼
$str = mb_convert_encoding($str, "utf-8", "gb2312");
//$str = mb_convert_encoding($str, "gb2312", "utf-8");
//ini_set('max_execution_time', '180');
set_time_limit(1800);
//處理內容
$str1 = "/<tr[^<]*<td[^<]*>(?<value1>.*?)<//td>[^<]*<td[^<]*>(?<value2>.*?)<//td>[^<]*<td[^<]*>(?<value3>.*?)<//td>[^<]*<td[^<]*>(?<value4>.*?)//<br//>[//s//S]*//<//a//><//td>[^<]*<td[^<]*>(?<value5>.*?)<//td>[^<]*<td[^<]*>(?<value6>.*?)<//td>[^<]*<td[^<]*>(?<value7>.*?)<//td>[^<]*<td[^<]*>(?<value8>.*?)<//td>[^<]*<td[^<]*>(?<value9>.*?)<//td>[^<]*<td[^<]*>(?<value10>.*?)<//td>[^<]*<td[^<]*>(?<value11>.*?)<//td>[^<]*<td[^<]*>(?<value12>.*?)<//td>[^<]*<td[^<]*>(?<value13>.*?)<//td>[^<]*<td[^<]*>(?<value14>.*?)<//td>[^<]*<td[^<]*>(?<value15>.*?)<//td>[^<]*<td[^<]*>(?<value16>.*?)<//td>[^<]*<td[^<]*>(?<value17>.*?)<//td>[^<]*<td[^<]*>(?<value18>.*?)<//td>[^<]*<td[^<]*>(?<value19>.*?)<//td>[^<]*<td[^<]*>(?<value20>.*?)<//td>[^<]*<td[^<]*>(?<value21>.*?)<//td>[^<]*<td[^<]*>(?<value22>.*?)<//td>[^<]*<td[^<]*>(?<value23>.*?)<//td>[^<]*<td[^<]*>(?<value24>.*?)<//td>[^<]*<td[^<]*>(?<value25>.*?)<//td>[^<]*<td[^<]*>(?<value26>.*?)<//td>[^<]*<td[^<]*>(?<value27>.*?)<//td>[^<]*<td[^<]*>(?<value28>.*?)<//td>[^<]*<td[^<]*>(?<value29>.*?)<//td>[^<]*<td[^<]*>(?<value30>.*?)<//td>[^<]*<td[^<]*>(?<value31>.*?)<//td>[^<]*<td[^<]*>(?<value32>.*?)<//td>[^<]*<td[^<]*>(?<value33>.*?)<//td>[^<]*<td[^<]*>(?<value34>.*?)<//td>[^<]*<td[^<]*>(?<value35>.*?)<//td>[^<]*<td[^<]*>(?<value36>.*?)<//td>[^<]*<td[^<]*>(?<value37>.*?)<//td>[^<]*<td[^<]*>(?<value38>.*?)<//td>[^<]*<td[^<]*>(?<value39>.*?)<//td>[^<]*<td[^<]*>(?<value40>.*?)<//td>[^<]*<td[^<]*>(?<value41>.*?)<//td>[^<]*<td[^<]*>(?<value42>.*?)<//td>[^<]*<td[^<]*>(?<value43>.*?)<//td>[^<]*<td[^<]*>(?<value44>.*?)<//td>[^<]*<td[^<]*>(?<value45>.*?)<//td>[^<]*<td[^<]*>(?<value46>.*?)<//td>[^<]*<td[^<]*>(?<value47>.*?)<//td>[^<]*<td[^<]*>(?<value48>.*?)<//td>[^<]*<td[^<]*>(?<value49>.*?)<//td>[^<]*<//tr>/";
$str2 = "<tr bgcolor='#EDEDED' height='20'><td>2011年2月11日</td><td>16:12</td><td>000877</td><td class=tdred>天山股份 <br><a target='_blank' href="http://b.shdjt.com/gaoan/ddxfs.asp?gpdm=000877" mce_href="http://b.shdjt.com/gaoan/ddxfs.asp?gpdm=000877">分時ddx</a> <a target='_blank' href="http://qgqp.shdjt.com/gpdm.asp?gpdm=000877" mce_href="http://qgqp.shdjt.com/gpdm.asp?gpdm=000877">點評</a> <a target='_blank' href="http://news.shdjt.com/newsgpdm.asp?gpdm=000877" mce_href="http://news.shdjt.com/newsgpdm.asp?gpdm=000877">新聞</a> <a target='_blank' href="gpdmyd.asp?gpdm=000877" mce_href="gpdmyd.asp?gpdm=000877">異動</a> <a target='_blank' href="http://cwzx.shdjt.com/gpdmgd.asp?gpdm=000877" mce_href="http://cwzx.shdjt.com/gpdmgd.asp?gpdm=000877">股東</a></td><td>33.81</td><td class=tdred>6.42</td><td class=tdred>0.241</td><td>0.287</td><td>16.748</td> <td class=tdbgred>2468</td> <td class=tdred>1251</td> <td class=tdred>1217</td> <td class=tdred>-676</td> <td class=tdred>-1792</td> <td class=tdbgred>8.76</td><td class=tdred>17.28</td><td class=tdred>7.3</td><td>0.414</td><td>0.396</td><td>0.053</td><td>-2.067</td><td>7</td><td>2</td><td class=tdred>3.7</td><td>3.6</td><td>-2.0</td><td class=tdred>-5.3</td><td>107</td><td>1.19</td><td class=tdred>-5401</td><td>131</td><td>7119</td><td>8479</td><td>14.3</td><td>12.0</td><td>-1792</td><td>2468</td><td>6.0</td><td>2.3</td><td>51.1</td><td>47.5</td><td>18.5</td><td>20.5</td><td>24.4</td><td>29.7</td><td>3.30</td><td>1.85</td><td>18.74③</td><td>1.353</td></tr>";
echo preg_match_all($str1,$str,$strs);
/*
foreach ($strs as $row)
{
echo mb_convert_encoding($row, "utf-8", "gb2312")."</br>";
}
*/
/*
if ($output === FALSE) {
echo "cURL Error: " . curl_error($ch);
}
*/
//var_mp($str);
//釋放curl句柄
curl_close($ch);
?>
Ⅲ php+curl獲取的表單源碼,以字元串轉換為數組
function sendcheck($url,$code)
{
global $logger;
$ch = curl_init();
if(!$ch)return -1; //設置適當的參數
curl_setopt($ch, CURLOPT_URL , $url);//連接
if(!curl_setopt($ch, CURLOPT_HEADER, 0)) return -2; //發送,設置curl_exec執行結果返回,成功返回獲得內容,否則false
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //返回值為空
if(!curl_setopt($ch,CURLOPT_TIMEOUT ,30))return -3; //執行curl操作最大時間為 10 s
if(!curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30))return -4 ; //curl對外連接大時間為 10 s
$result = curl_exec($ch); //訪問資源;
//伺服器無響應或者網路連接錯誤處理,重新發送請求信息,最多10次,每次 10 s 間隔
for($i =0 ; $i <= 9; $i++ ){
if(!$result){ //上一次未得到數據
$result = curl_exec($ch); //下一次的數據發送;
}else{
$logger->info("已成功通知");
break;
}
}
if(!$result){
$logger->info("通知失敗");
}
curl_close($ch); //關閉curl資源
}
Ⅳ php關於curl請求回來的數據轉化數組後該索引有值卻取不出來求各路大神解決
可以先看看PHP中的 curl_exec函數的說明
(PHP 4 >= 4.0.2, PHP 5)
curl_exec — 執行一個cURL會話
說明
mixed curl_exec ( resource $ch )
執行給定的cURL會話。
這個函數應該在初始化一個cURL會話並且全部的選項都被設置後被調用。
參數
ch
由 curl_init() 返回的 cURL 句柄。
返回值
成功時返回 TRUE, 或者在失敗時返回 FALSE。 然而,如果 CURLOPT_RETURNTRANSFER選項被設置,函數執行成功時會返回執行的結果,失敗時返回 FALSE 。
我前兩天剛好用到過的兩種情況
//從返回結果中獲取指定的值$res=curl_exec($ch);$pa = '%<ul class="ul1"><li>本站主數據:(.*?)</li>%si';preg_match($pa,$res,$r);return $r[1];
//第二種 的返回結果是以json形式。$res=json_decode(curl_exec($ch),true);print_r($res);
Ⅳ php curl 取不到數據 幫我看下 是為什麼
有以下幾種可能:
1、伺服器端確實沒有數據返回;
2、curl寫錯了;
3、試試下面這個,我在用的
functioncurl($url,$post='POST',$data=array()){
$ch=curl_init();
$headers[]="Accept-Charset:utf-8";
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,$post);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch,CURLOPT_SSLVERSION,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0(compatible;MSIE5.01;WindowsNT5.0)');
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_AUTOREFERER,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$result=curl_exec($ch);
curl_close($ch);
returnjson_decode($result,1);
}
Ⅵ php curl 得到的數組被轉成字元串 怎麼轉回數組
數組轉成json結構
$arr = array();
$json = json_encode($arr); // json字元串
$arr = json_decode($json,TRUE); // 恢復數組
Ⅶ php 中 怎麼讓curl_exec 以數組形式返回
可以先看看PHP中的 curl_exec函數的說明
(PHP 4 >= 4.0.2, PHP 5)
curl_exec—執行一個cURL會話
說明
mixedcurl_exec(resource$ch)
執行給定的cURL會話。
這個函數應該在初始化一個cURL會話並且全部的選項都被設置後被調用。
參數
ch
由curl_init()返回的 cURL 句柄。
返回值
成功時返回TRUE, 或者在失敗時返回FALSE。 然而,如果CURLOPT_RETURNTRANSFER選項被設置,函數執行成功時會返回執行的結果,失敗時返回FALSE。
我前兩天剛好用到過的兩種情況
//從返回結果中獲取指定的值
$res=curl_exec($ch);
$pa='%<ulclass="ul1"><li>本站主數據:(.*?)</li>%si';
preg_match($pa,$res,$r);
return$r[1];
//第二種的返回結果是以json形式。
$res=json_decode(curl_exec($ch),true);
print_r($res);
Ⅷ php獲取數據為什麼curl獲取不完整
因為,PHP CURL庫默認1024位元組的長度不等待數據的返回,所以你那段代碼需增加一項配置:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
給你一個更全面的封裝方法:
function req_curl($url, &$status = null, $options = array())
{
$res = '';
$options = array_merge(array(
'follow_local' => true,
'timeout' => 30,
'max_redirects' => 4,
'binary_transfer' => false,
'include_header' => false,
'no_body' => false,
'cookie_location' => dirname(__FILE__) . '/cookie',
'useragent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
'post' => array() ,
'referer' => null,
'ssl_verifypeer' => 0,
'ssl_verifyhost' => 0,
'headers' => array(
'Expect:'
) ,
'auth_name' => '',
'auth_pass' => '',
'session' => false
) , $options);
$options['url'] = $url;
$s = curl_init();
if (!$s) return false;
curl_setopt($s, CURLOPT_URL, $options['url']);
curl_setopt($s, CURLOPT_HTTPHEADER, $options['headers']);
curl_setopt($s, CURLOPT_SSL_VERIFYPEER, $options['ssl_verifypeer']);
curl_setopt($s, CURLOPT_SSL_VERIFYHOST, $options['ssl_verifyhost']);
curl_setopt($s, CURLOPT_TIMEOUT, $options['timeout']);
curl_setopt($s, CURLOPT_MAXREDIRS, $options['max_redirects']);
curl_setopt($s, CURLOPT_RETURNTRANSFER, true);
curl_setopt($s, CURLOPT_FOLLOWLOCATION, $options['follow_local']);
curl_setopt($s, CURLOPT_COOKIEJAR, $options['cookie_location']);
curl_setopt($s, CURLOPT_COOKIEFILE, $options['cookie_location']);
if (!empty($options['auth_name']) && is_string($options['auth_name']))
{
curl_setopt($s, CURLOPT_USERPWD, $options['auth_name'] . ':' . $options['auth_pass']);
}
if (!empty($options['post']))
{
curl_setopt($s, CURLOPT_POST, true);
curl_setopt($s, CURLOPT_POSTFIELDS, $options['post']);
//curl_setopt($s, CURLOPT_POSTFIELDS, array('username' => 'aeon', 'password' => '111111'));
}
if ($options['include_header'])
{
curl_setopt($s, CURLOPT_HEADER, true);
}
if ($options['no_body'])
{
curl_setopt($s, CURLOPT_NOBODY, true);
}
if ($options['session'])
{
curl_setopt($s, CURLOPT_COOKIESESSION, true);
curl_setopt($s, CURLOPT_COOKIE, $options['session']);
}
curl_setopt($s, CURLOPT_USERAGENT, $options['useragent']);
curl_setopt($s, CURLOPT_REFERER, $options['referer']);
$res = curl_exec($s);
$status = curl_getinfo($s, CURLINFO_HTTP_CODE);
curl_close($s);
return $res;
}
Ⅸ curl命令在PHP中怎麼用
這是我項目中一直在用的一個方法
<?php
functioncurl($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);
//RequestPayload格式數據
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(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/51.0.2704.106Safari/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默認鏈接超時時間是多少
HTTP1.0與HTTP1.1的一個很大的差別是HTTP1.1支持長連接。現實中有很多這個場景,就是請求了一個頁面,然後這個頁面的其他內容,例如CSS文件,JS文件都要從同一個服務(相同伺服器,相同埠)上面獲取。這些向相同伺服器的請求如果能夠復用連接,是很有利於提供網路性能。
總的來說,復用HTTP連接有兩個好處:
1. 節省系統埠資源(每一次連接都要使用埠,埠的資源是有限的)
2. 節省創建socket連接的時間。
下面講講在PHP下面,如何使用CURL來復用連接:
curl是在一個handle裡面復用連接的,所以這樣就可以復用連接了:
$ch = curl_init();
$ret = curl_exec($ch);
......
$ret2 = curl_exec($ch);
....
curl_close($ch);
在初始化跟關閉$ch資源時即可復用連接。
我這里寫了兩個函數,可以支持GET跟POST的請求,大家感興趣可以看看。
function curl_get($url, $timeout=5) {
global $g_handle;
if (empty($g_handle)) $ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FRESH_CONNECT => false,
CURLOPT_FORBID_REUSE => false,
CURLOPT_TIMEOUT => $timeout
);
curl_setopt_array($g_handle, $options);
$ret = curl_exec($g_handle);
return $ret;
}
// 可以支持POST數據,$post是一個數組,$timeout是超時時間。
function curl_post($url, $post=array(), $timeout=10) {
global $g_handle;
if (empty($g_handle)) $g_handle = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FRESH_CONNECT => false,
CURLOPT_FORBID_REUSE => false,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_POSTFIELDS => http_build_query($post)
);
if (empty($post)) $options[CURLOPT_POST] = false;
curl_setopt_array($g_handle, $options);
$ret = curl_exec($g_handle);
return $ret;
}