ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 函数集目录 [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; } ~~~