# 函数集目录
[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;
}
~~~