# 函數集目錄
[TOC=2,3]
* * * * *
* * * * *
* * * * *
- ## 接口:遠程請求api函數1
* * * * *
>[info]#### 1.遠程請求api函數(支持:GET、POST、POST[json]、http/https)【curl_api】
~~~
<?php
/**
* 遠程CURL請求API函數(支持:GET、POST、POST[json]、http/https,并進行日志記錄)
* @param Array $params 請求的信息數組
* 接口請求錯誤:status=100 data:服務器錯誤信息
* 接口正常響應:status=200 data:接口信息
*/
function curl_api($params = array())
{
$params = array(
'url' => $params['url'], // 必須有 請求的地址
'request_data' => $params['request_data']?:'', //要傳輸的數據
'type' => $params['type'] ? : 'GET', // POST/GET/post/get 默認為GET
'json' => $params['json'] ? : FALSE, // 是否json數據傳輸(POST下有效),默認為非json
'timeout' => $params['timeout'] ? : 30, // 超時時間,默認為30s
'debug' => $params['debug'] ? : FALSE,//是否打印詳細信息,默認關閉
'log' => $params['log'] ? : FALSE,// 默認關閉日志(日志輸出)
'log_title' => $params['log_title'] ? : '',// 日志標題
'log_name' => $params['log_name'] ? : 'log',// 日志文件名
'log_dir' => $params['log_dir'] ? : '',// 日志路徑
);
$type = strtoupper($params['type']);
$params['request_data'] = $type == 'POST' && $params['json'] ? json_encode($params['request_data']) : http_build_query($params['request_data']);
$option_arr = array();
$response_data = array();
$option_arr = array(
CURLOPT_URL => $params['url'],
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_RETURNTRANSFER => TRUE, // 要求結果為字符串且輸出到屏幕上
CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0", // 模擬瀏覽器類型
CURLOPT_MAXREDIRS => 5,
CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_TIMEOUT => $params['timeout'],
CURLOPT_SSL_VERIFYPEER => FALSE, // 對認證證書來源的檢查 支持https
CURLOPT_SSL_VERIFYHOST => FALSE,
CURLOPT_POST => $type == 'POST' ? TRUE : FALSE,
CURLOPT_HTTPHEADER => $type == 'POST' && $params['json'] ? array(
"Content-type: application/json;charset=utf-8"
) : array(),
CURLOPT_POSTFIELDS => $params['request_data']
);
$ch = curl_init();
curl_setopt_array($ch, $option_arr);
$response_data = curl_exec($ch);
$curl_no = curl_errno($ch);
$curl_or = curl_error($ch);
//$curl_info = curl_getinfo($ch);
$response_data = ! empty($response_data) && ! is_null(json_decode($response_data)) ? json_decode($response_data, true) : $response_data;
curl_close($ch);
if ($curl_no > 0) {
$response_data = array('status' => 100,'data' => 'errorCode(' . $curl_no . ')' . $curl_or);
} else{
$response_data = array('status' => 200,'data' => $response_data);
}
$log_content='';
if($params['log']){
$log_content='';
$log_content .= "【CURL請求開始】:{$params['log_title']}\n";
$log_content .= '【請 求 時 間 】:'.date("Y-m-d H:i:s").'\n';
$log_content .= "【請 求 URL 】:{$params['url']}\n";
$log_content .= "【請 求 數 據】:\n";
$log_content .= $params['json']?$params['request_data']:json_encode($params['request_data']);
$log_content .= "【響 應 數 據】:\n";
$log_content .= print_r($response_data, true);
$log_content .= "【CURL請求結束】:\n";
$this->Share->_write_log($params['log_name'], $params['log_dir'], $log_content);
}
if ($params['debug']) { // 輸出請求、響應數據
echo $log_content;
}
return $response_data;
}
~~~
>[info]#### 2. 測試
- #### 函數使用
~~~
$data=array(
'username'=>'5555@qq.com',
'password'=>'1234567',
);
$params=array(
'url' => "http://www.ityangss.com.xx.cc/test/curl/info.php", // 必須有
'request_data' => $data, // 必須有
'type' => 'POST', // 默認為GET
'json' => true, // 默認為非json
'timeout' => 30,// 默認為30s
'debug' => true,// 默認關閉調試(信息輸出)
);
curl_api($params);
~~~
* * * * *
* * * * *
* * * * *
- ## 接口:遠程請求api函數2
* * * * *
>[info]#### 1.遠程請求api函數(支持:GET、POST、POST[json]、http/https)【curl_api】
~~~
/**
* 遠程請求api函數(支持:GET、POST、POST[json]、http/https)
* @param string $url 請求的地址
* @param string $type POST/GET/post/get
* @param array $request_data 要傳輸的數據
* @param int $timeout 超時時間
* @param int $json 是否json數據傳輸(POST下可以)
* @param int debug 是否打印詳細信息,默認關閉
*/
function curl_api($params = array())
{
$params = array(
'url' => $params['url'], // 必須有
'request_data' => $params['request_data'], // 必須有
'type' => $params['type'] ? : 'GET', // 默認為GET
'json' => $params['json'] ? : FALSE, // 默認為非json
'timeout' => $params['timeout'] ? : 30, // 默認為30s
'debug' => $params['debug'] ? : FALSE,// 默認關閉調試(信息輸出)
);
$type = strtoupper($params['type']);
$params['request_data'] = $type == 'POST' && $params['json'] ? json_encode($params['request_data']) : http_build_query($params['request_data']);
$option_arr = array();
$response_data = array();
$option_arr = array(
CURLOPT_URL => $params['url'],
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_RETURNTRANSFER => TRUE, // 要求結果為字符串且輸出到屏幕上
CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0", // 模擬瀏覽器類型
CURLOPT_MAXREDIRS => 5,
CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_TIMEOUT => $params['timeout'],
CURLOPT_SSL_VERIFYPEER => FALSE, // 對認證證書來源的檢查 支持https
CURLOPT_SSL_VERIFYHOST => FALSE,
CURLOPT_POST => $type == 'POST' ? TRUE : FALSE,
CURLOPT_HTTPHEADER => $type == 'POST' && $params['json'] ? array(
"Content-type: application/json;charset=utf-8"
) : array(),
CURLOPT_POSTFIELDS => $params['request_data']
);
$ch = curl_init();
curl_setopt_array($ch, $option_arr);
$response_data = curl_exec($ch);
$curl_no = curl_errno($ch);
$response_data = ! empty($response_data) && ! is_null(json_decode($response_data)) ? json_decode($response_data, true) : $response_data;
if ($curl_no) { // 請求錯誤
$response_data = array(
'status' => 100,
'data' => 'errorCode(' . $curl_no . '):' . curl_error($ch)
);
} else {
$response_data = is_array($response_data) ? array(
'status' => 200,
'data' => $response_data
) : array(
'status' => 101,
'data' => $response_data
);
}
if ($params['debug']) { // 輸出請求、響應數據
echo "=====request data======<br/>";
echo "<pre>";
print_r($params['request_data']);
echo "</pre>";
echo "<br/>=====request info=====<br/>";
echo "<pre>";
print_r(curl_getinfo($ch));
echo "</pre>";
echo "<br/>=====response data=====<br/>";
echo "<pre>";
print_r($response_data);
echo "</pre>";
}
curl_close($ch);
return $response_data;
}
~~~
>[info]#### 2. 測試
- #### 函數使用
~~~
$data=array(
'username'=>'5555@qq.com',
'password'=>'1234567',
);
$params=array(
'url' => "http://www.ityangss.com.xx.cc/test/curl/info.php", // 必須有
'request_data' => $data, // 必須有
'type' => 'POST', // 默認為GET
'json' => true, // 默認為非json
'timeout' => 30,// 默認為30s
'debug' => true,// 默認關閉調試(信息輸出)
);
curl_api($params);
~~~
- #### 函數結果
~~~
=====request data======
{"username":"5555@qq.com","password":"1234567"}
=====request info=====
Array
(
[url] => http://www.ityangss.com.xx.cc/test/curl/info.php
[content_type] => text/html
[http_code] => 200
[header_size] => 184
[request_size] => 280
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.157
[namelookup_time] => 0
[connect_time] => 0.016
[pretransfer_time] => 0.016
[size_upload] => 45
[size_download] => 45
[speed_download] => 286
[speed_upload] => 286
[download_content_length] => 45
[upload_content_length] => 45
[starttransfer_time] => 0.157
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 47.90.92.56
[certinfo] => Array
(
)
[primary_port] => 80
[local_ip] => 192.168.2.102
[local_port] => 64123
)
=====response data=====
Array
(
[status] => 200
[data] => Array
(
[username] => 5555@qq.com
[password] => 1234567
)
)
~~~
* * * * *
* * * * *
* * * * *
- ## 接口:遠程請求api函數3
* * * * *
>[info]#### 1.遠程請求api函數3【curl_api】
~~~
/**
* 遠程請求(支持post,get,json)
* @param: $url 請求地址
* @param: $data 數組
* @param: $options 請求頭
* @param: $method 請求方式
* @param: $method 是否json請求
* @author: ityangs<ityangs@163.com>
*/
function curl_api($url, array $data = NULL, array $options = array(), $method='get', $json=false)
{
$datas= $method=='post' && $json ? json_encode($data) : http_build_query($data);
$options=$method=='post' && $json ? $options + array('Content-Type: application/json;charset=utf-8') : $options;
$defaults = $method=='post'?
array(
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_URL => $url,
CURLOPT_FRESH_CONNECT => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FORBID_REUSE => 1,
CURLOPT_TIMEOUT => 300,
CURLOPT_POSTFIELDS => $datas
) :
array(
CURLOPT_URL => $url. (strpos($url, '?') === FALSE ? '?' : ''). http_build_query($data),
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 4
);
$ch = curl_init();
curl_setopt_array($ch, ($options + $defaults));
if( ! $result = curl_exec($ch))
{
trigger_error(curl_error($ch));
}
curl_close($ch);
return $result;
}
~~~
>[info]#### 2. 測試
- #### 函數使用
~~~
$header = array(
'User-Auth:'.$this->user_auth
);
curl($url,$request_data,array(CURLOPT_HTTPHEADER=>$header),'post',true);
~~~
* * * * *
* * * * *
* * * * *
- ## 接口:遠程請求api函數4
* * * * *
>[info]#### 1.遠程請求api函數4【iCurl】
~~~
/**
* curl請求
* @param $url
* @param null $data 發送數據 如果發送數據是數組,建議進行http_build_query處理成字符串以便更高的兼容性
* @param string $method 請求方法
* @param array $headers 請求頭 鍵值對數組,如: array('Content-Type' => 'text/html; charset=utf-8'),兼容array('Content-Type:text/html; charset=utf-8')
* @param array $options 其他的標準的curl選項, 鍵值對數組,如array(CURLOPT_USERAGENT => 'wms-server');
* @param null $cookies 攜帶cookie 鍵值對數組或者標準cookie字符串都可以
* @param null $info 請求信息,包含絕大部分信息,出錯了可以看這個錯誤消息
* @return mixed|null
*/
function iCurl($url, $data = null, $method = 'get', array $headers = array(), array $options = array(), $cookies = null, &$info = null)
{
$method = strtoupper($method);
if ($data) {
if ($method == 'GET') {
$data = is_array($data) ? http_build_query($data) : $data;
$url = strpos($url, '?') !== false ? $url . '&' . $data : $url . '?' . $data;//get的參數直接拼接在url后面
$curl = curl_init($url);
} else {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
} else {
$curl = curl_init($url);
}
//設置基本的選項
curl_setopt_array($curl, array(
CURLOPT_TIMEOUT => 30, //超時時間
CURLOPT_CUSTOMREQUEST => $method,// 請求方法
CURLOPT_RETURNTRANSFER => true,// 返回內容
CURLOPT_HEADER => false,// 返回header
CURLOPT_FOLLOWLOCATION => true,// 自動重定向
CURLOPT_MAXREDIRS => 10, //重定向最大次數
CURLOPT_SSL_VERIFYPEER => false,// 不校驗證書
));
//設置頭信息
if (!empty($headers)) {
$_headers = [];
foreach ($headers as $name => $value) { //處理成CURL可以識別的headers格式
$_headers[] = is_int($name) ? $value : $name . ':' . $value; //兼容已經拼好的字符串數組
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $_headers);
}
//設置cookie
if (!empty($cookies)) {
$_cookies = '';
if (is_array($cookies)) {
foreach ($cookies as $name => $value) {
$_cookies .= "{$name}={$value}; ";
}
} else {
$_cookies = $cookies;
}
curl_setopt($curl, CURLOPT_COOKIE, $_cookies);
}
//其他特殊選項
if (!empty($options)) {
curl_setopt_array($curl, $options);
}
//執行請求
$output = curl_exec($curl);
$info = curl_getinfo($curl);
//http狀態碼必須是200 才認為請求成功
if ($info['http_code'] != 200) {
$info['error'] = curl_error($curl);
$info['output'] = $output;
//記錄詳細錯誤日志
get_instance()->Share->_write_log('log', 'curl', array('args'=>func_get_args(), 'curlInfo'=>$info));
$output = null;
}
curl_close($curl);
return $output;
}
~~~
>[info]#### 2. 測試
- #### 函數使用
~~~
iCurl(config_item('ic_host') . config_item('ic_secret_key_url'),'get',array('Content-Type' => 'text/html; charset=utf-8'));
~~~
* * * * *
* * * * *
* * * * *
- ## 下載文件:實現下載遠程文件保存到本地
* * * * *
>[info]#### 1.實現下載遠程文件保存到本地【curl_get_file】
~~~
/**
* 實現下載遠程文件保存到本地[當保存文件名稱為空時則使用遠程文件原來的名稱]
* @param unknown $url 文件url
* @param string $save_dir 保存文件目錄
* @param string $filename 保存文件名稱
* @param number $type 使用的下載方式
* @return multitype:string number
*/
function curl_down($url,$save_dir='',$filename='',$type=0,$timeout=30){
$save_dir = iconv("utf-8","gb2312//IGNORE",$save_dir);
$filename = iconv("utf-8","gb2312//IGNORE",$filename);
if(trim($url)==''){
return array('status'=>400,'message'=>'文件下載地址為空!');
}
if(trim($save_dir)==''){
$save_dir='./';
}
if(trim($filename)==''){//保存文件名
$ext=strrchr($url,'.');
$filename=time().$ext;
}
if(0!==strrpos($save_dir,'/')){
$save_dir.='/';
}
//創建保存目錄
if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
return array('status'=>400,'message'=>'保存文件不能寫入!');
}
//獲取遠程文件所采用的方法
if($type){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$res=curl_exec($ch);
curl_close($ch);
}else{
ob_start();
readfile($url);
$res=ob_get_contents();
ob_end_clean();
}
$size=strlen($res);
//文件大小
$fp2=@fopen($save_dir.$filename,'w');
fwrite($fp2,$res);
fclose($fp2);
unset($res,$url);
return array('status'=>200,'file_name'=>$filename,'save_path'=>$save_dir.$filename);
}
~~~
>[info]#### 2. 測試
- #### 函數使用
~~~
curl_down("http://www.baidu.com/img/baidu_sylogo1.gif",'下載/下載/','下載.gif',0);
~~~
- #### 函數結果
~~~
文件下載下來
~~~
* * * * *
* * * * *
* * * * *
- ## curl爬蟲
* * * * *
>[info]#### 1.curl爬蟲【curl_spider】
~~~
/**
* curl爬蟲
* @param unknown $url
* @param string $return
* @param unknown $postData
* @param string $cookiePath
* @param string $referer
* @param unknown $proxy
* @param string $userAgent
* @return mixed
*/
function curl_spider($url, $return = true, $postData = array(), $cookiePath = null, $referer = null, $proxy = array(), $userAgent = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")
{
$ch = curl_init();
$optionArray = array(
CURLOPT_AUTOREFERER => true,
CURLOPT_URL => $url, // 目標URL
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1, // 不直接打印顯示
CURLOPT_CONNECTTIMEOUT => 3, // 連接超時3s
CURLOPT_TIMEOUT => 12, // 執行超時12s
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false
); // 此處兩個SSL相關參數是適應HTTPS網頁
if (count($proxy) > 0) { // 網頁代理設置,代理,大家都懂的,可以做很多事
$optionArray[CURLOPT_HTTPPROXYTUNNEL] = true; // HTTP代理開關
if (! empty($proxy['type']) && $proxy['type'] == 'socket') {
$optionArray[CURLOPT_PROXYTYPE] = CURLPROXY_SOCKS5; // 可以使用socket代理(×這里我沒有測試socket代理)
}
$optionArray[CURLOPT_PROXY] = $proxy['url'];
if (! empty($proxy['auth'])) { // 代理驗證
$optionArray[CURLOPT_PROXYAUTH] = false;
$optionArray[CURLOPT_PROXYUSERPWD] = $proxy['auth']; // 格式 username:password
}
}
if (! empty($referer)) { // HTTP頭部的referer
$optionArray[CURLOPT_REFERER] = $referer;
}
if (! empty($userAgent)) { // HTTP頭部的UserAgent
$optionArray[CURLOPT_USERAGENT] = $userAgent;
}
if (! empty($cookiePath)) { // Cookie的保存與傳遞(cookiePath是一個cookie文件,自定義即可)
$optionArray[CURLOPT_COOKIEFILE] = $cookiePath; // 傳遞cookie
$optionArray[CURLOPT_COOKIEJAR] = $cookiePath; // 保存cookie
}
if (count($postData) > 0) { // post傳值
$optionArray[CURLOPT_POST] = 1;
$optionArray[CURLOPT_POSTFIELDS] = $postData;
}
curl_setopt_array($ch, $optionArray);
$content = curl_exec($ch);
if (! curl_errno($ch)) {
$output = curl_getinfo($ch);
}
curl_close($ch);
if ($return) {
$output['content'] = $content;
print_r($output,true);
return $output;
} else {
echo $content;
}
}
~~~
>[info]#### 2. 測試
- #### 函數使用
~~~
$proxy = array(
'url' => 'http://localhost:8087'
);
print_r(curl_spider('http://127.0.0.1/test/curl/ip.php', true, array(), null, null, $proxy));
~~~
~~~
/**
* curl請求
* @param $url
* @param null $data 發送數據 如果發送數據是數組,建議進行http_build_query處理成字符串以便更高的兼容性
* @param string $method 請求方法
* @param array $headers 請求頭 鍵值對數組,如: array('Content-Type' => 'text/html; charset=utf-8'),兼容array('Content-Type:text/html; charset=utf-8')
* @param array $options 其他的標準的curl選項, 鍵值對數組,如array(CURLOPT_USERAGENT => 'wms-server');
* @param null $cookies 攜帶cookie 鍵值對數組或者標準cookie字符串都可以
* @param null $info 請求信息,包含絕大部分信息,出錯了可以看這個錯誤消息
* @return mixed|null
*/
function iCurl($url, $data = null, $method = 'get', array $headers = array(), array $options = array(), $cookies = null, &$info = null)
{
$method = strtoupper($method);
if ($data) {
if ($method == 'GET') {
$data = is_array($data) ? http_build_query($data) : $data;
$url = strpos($url, '?') !== false ? $url . '&' . $data : $url . '?' . $data;//get的參數直接拼接在url后面
$curl = curl_init($url);
} else {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
} else {
$curl = curl_init($url);
}
//設置基本的選項
curl_setopt_array($curl, array(
CURLOPT_TIMEOUT => 30, //超時時間
CURLOPT_CUSTOMREQUEST => $method,// 請求方法
CURLOPT_RETURNTRANSFER => true,// 返回內容
CURLOPT_HEADER => false,// 返回header
CURLOPT_FOLLOWLOCATION => true,// 自動重定向
CURLOPT_MAXREDIRS => 10, //重定向最大次數
CURLOPT_SSL_VERIFYPEER => false,// 不校驗證書
));
//設置頭信息
if (!empty($headers)) {
$_headers = [];
foreach ($headers as $name => $value) { //處理成CURL可以識別的headers格式
$_headers[] = is_int($name) ? $value : $name . ':' . $value; //兼容已經拼好的字符串數組
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $_headers);
}
//設置cookie
if (!empty($cookies)) {
$_cookies = '';
if (is_array($cookies)) {
foreach ($cookies as $name => $value) {
$_cookies .= "{$name}={$value}; ";
}
} else {
$_cookies = $cookies;
}
curl_setopt($curl, CURLOPT_COOKIE, $_cookies);
}
//其他特殊選項
if (!empty($options)) {
curl_setopt_array($curl, $options);
}
//執行請求
$output = curl_exec($curl);
$info = curl_getinfo($curl);
//http狀態碼必須是200 才認為請求成功
if ($info['http_code'] != 200) {
$info['error'] = curl_error($curl);
$info['output'] = $output;
//記錄詳細錯誤日志
get_instance()->Share->_write_log('log', 'curl', array('args'=>func_get_args(), 'curlInfo'=>$info));
$output = null;
}
curl_close($curl);
return $output;
}
~~~