curl 封装类
<?php /**
* author: zbseoag
* QQ: 617937424 用法:
初始化或调用setting 方法可以设置 default 固定选项,option 是单次请求的选项。
$content = Curl::instance()->url($url)->get($data);
//数组参数可以累加
$content = Curl::instance()->data(['abc'=>123])->data(['def'=>456])->post(['gef'=>789]);
//字符串数据
$content = Curl::instance()->url($url)->data('{"aaa":"111"}')->post();
//发送文件
$content = Curl::instance()->url($url)->file('img.jpg')->post();
//静态方法调用
$content = Curl::post($url, $data);
//仅生成curl选项
$options = Curl::instance()->url($url)->file('img.jpg')->method('post')->create(); *
*/ class Curl{ //curl对象
protected $curl = null;
//对象实例
protected static $instance = null; //默认选项
public $default = array(
CURLOPT_HEADER => false,//是否显示头信息
CURLOPT_RETURNTRANSFER => true,//是否返回信息
CURLOPT_TIMEOUT => 30,//超时
CURLOPT_ENCODING => '',//支持的压缩类型
); //动态选项,只用一次
public $options = array(); protected $data = '';
protected $debug = false;
protected $sleep = 0;
protected static $info = array();
protected static $error = ''; public static function instance($options=array()){ if(is_null(self::$instance)) self::$instance = new static($options);
return self::$instance;
} private function __construct($default=array()){ $this->curl = curl_init();
$this->default = $default + $this->default; } /**
* 设置默认选项
* @param $name
* @param string $value
* @return $this
*/
public function setting($name, $value=''){ if(is_array($name)){
$this->default = $name + $this->options;
}else{
$this->default[$name] = $value;
}
return $this; } public function __call($method, $args){ if(!empty($args)) $this->data(current($args));
return $this->method($method)->exec();
} /**
* 快捷静态方法
* Curl::post($url, $data);
* @param $method
* @param $args
* @return mixed
*/
public static function __callStatic($method, $args){ if(!isset($args[1])) $args[1] = '';
return static::instance()->url($args[0])->data($args[1])->$method();
} public static function error(){
return self::$error;
} public static function info(){
return self::$info;
} public function log(){ $args = func_get_args();
$count = func_num_args();
$file = sys_get_temp_dir() . '/debug.curl.txt';
foreach($args as $key => $data){ file_put_contents($file, (is_string($data)? $data : var_export($data, true)), FILE_APPEND | LOCK_EX);
if($key < $count - 1) file_put_contents($file, "\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------\n", FILE_APPEND | LOCK_EX);
} file_put_contents($file, "\n================================================================================================[time ".date('Y-m-d H:i:s')."]================================================================================================\n", FILE_APPEND | LOCK_EX);
} public function __destruct(){
curl_close($this->curl);
} public function debug($value=true){ $this->debug = $value;
return $this;
} public function sleep($value = 0){ $this->sleep = $value;
return $this;
} /**
* 设置请求方法
* @param $value
* @return $this
*/
public function method($value){ $this->options[CURLOPT_CUSTOMREQUEST] = strtoupper($value);
return $this;
} /**
* 超时选项
* @param int $time
* @return $this
*/
public function timeout($value=30){ $this->options[CURLOPT_TIMEOUT] = $value;
return $this;
} public function url($value){ $this->options[CURLOPT_URL] = $value;
return $this;
} /**
* 设置header
*
* 字符串: 'key: value'
* 标准: ['key: value']
* 键值对: ['key' => value]
* @param string|array $header
* @return $this
*/
public function header($header=''){ if(is_array($header) && key($header) == 0){ foreach($header as $key => $value){
$header[] = $key . ': ' . $value;
unset($header[$key]);
} } if(is_string($header)) $header = array($header); if(!isset($this->options[CURLOPT_HTTPHEADER])) $this->options[CURLOPT_HTTPHEADER] = array();
$this->options[CURLOPT_HTTPHEADER] = array_merge($this->options[CURLOPT_HTTPHEADER], $header); return $this; } /**
* 组装数据
* @param $args
* @return $this
*/
public function data($value=''){ if(is_array($value)){
if(!is_array($this->data)) $this->data = array();
$this->data = array_merge($this->data, $value);
}else{
$this->data = $value;
} return $this; } /**
* Cookie选项
* @param $cookie
* @param bool $refresh
* @return $this
*/
public function cookie($cookie, $refresh=false){ if(strpos($cookie, '=')){
$this->options[CURLOPT_COOKIE] = $cookie;
}else{
$this->options[CURLOPT_COOKIEJAR] = $cookie;
$this->options[CURLOPT_COOKIEFILE] = $cookie;
} if($refresh) $this->options[CURLOPT_COOKIESESSION] = true; return $this; } /**
*
* @param int $verify_host 主机校验
* @param int $version 版本
* @return $this
*/
public function ssl($verify_host = 0, $version=CURL_SSLVERSION_DEFAULT){ $this->options[CURLOPT_SSL_VERIFYHOST] = $verify_host; //0不检测,2检查公用名是否与提供主机名匹配
$this->options[CURLOPT_SSLVERSION] = $version; //建议用默认值,在 SSLv2 和 SSLv3 中存在弱点 return $this;
} public function cainfo($value=''){ $this->options[CURLOPT_CAINFO] = $value;
return $this;
} public function capath($value=''){ $this->options[CURLOPT_CAPATH] = $value;
return $this;
} /**
* 生成选项
* @return array
*/
public function create(){ $data = is_array($this->data)? http_build_query($this->data) : $this->data;
if($this->data != ''){ if($this->options[CURLOPT_CUSTOMREQUEST] == 'GET'){ $link = strpos($this->options[CURLOPT_URL], '?') === false? '?' : '&'; if(is_array($this->data) && is_numeric(key($this->data))){
$link = strpos($this->options[CURLOPT_URL], '/') === false? '/' : '';
$data = implode('/', $this->data);
} $this->options[CURLOPT_URL] .= $link . $data;
}else{
$this->options[CURLOPT_POSTFIELDS] = $data;
}
}
$this->data = '';
$scheme = parse_url($this->options[CURLOPT_URL]);
$scheme = $scheme['scheme'];
if($scheme == 'https' && !isset($this->options[CURLOPT_SSL_VERIFYHOST])) $this->ssl(); //验证对等证书
if((isset($this->options[CURLOPT_CAINFO]) && !empty($this->options[CURLOPT_CAINFO])) || (isset($this->options[CURLOPT_CAPATH]) && !empty($this->options[CURLOPT_CAPATH]))){
$this->options[CURLOPT_SSL_VERIFYPEER] = true;//当设置了 CURLOPT_CAINFO 或 CURLOPT_CAPATH 则表示要验证的交换证书
}else{
$this->options[CURLOPT_SSL_VERIFYPEER] = false;
} //带上默认选项
$options = $this->options + $this->default;
$this->options = array();
ksort($options); return $options; } /**
* 执行请求
* @return bool|string
*/
public function exec(){ $options = $this->create(); curl_setopt_array($this->curl, $options);
$result = curl_exec($this->curl); //记录日志
if($this->debug){ if(self::$error = curl_errno($this->curl)) self::$error = curl_error($this->curl) . '('. self::$error .')';
if(empty(self::$error)) self::$error = ''; self::$info = curl_getinfo($this->curl);
$this->log(self::$error? self::$error : '请求成功:' . $result, $options, self::$info);
} curl_reset($this->curl);
if($this->sleep) sleep($this->sleep); return $result; } public function host($value){ $this->header('Host: ' . $value);
return $this;
} public function origin($value){ $this->header('Origin: ' . $value);
return $this;
} public function agent($value=''){ if(empty($value)) $value = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36';
$this->header('User-Agent: ' . $value); return $this;
} public function accept($value=''){ if(empty($value)) $value = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8';
$this->header('Accept: ' . $value); return $this;
} public function language($value=''){ if(empty($value)) $value = 'zh,zh-CN;q=0.9,en;q=0.8,en-US;q=0.7';
$this->header('Accept-Language', $value);
return $this;
} public function referer($value){ $this->header('Referer: ' . $value);
return $this;
} public function location($value=3){ $this->options[CURLOPT_FOLLOWLOCATION] = true; //根据返回的Location重定
$this->options[CURLOPT_MAXREDIRS] = $value; //限制重定向次数 return $this;
} /**
* 发送文件
* @param $file
* @param string $upname
* @param string $mime
* @param string $name
* @return $this
*/
public function file($file, $upname='file', $mime='', $name=''){ $data = array($upname => curl_file_create(realpath($file), $mime, $name)); if(isset($this->options[CURLOPT_POSTFIELDS])){
$this->options[CURLOPT_POSTFIELDS] = $data + $this->options[CURLOPT_POSTFIELDS];
}else{
$this->options[CURLOPT_POSTFIELDS] = $data;
}
return $this; } }
curl 封装类的更多相关文章
- php curl封装类
一个php curl封装的类,减少代码量,简化采集工作.这个类也是我工作的最常用的类之一.这里分享给大家.配合上phpquery,十分好用. <?php namespace iphp\core; ...
- php的curl封装类
之前一直做爬虫相关的,每次自己去写一系列curl_setopt()函数太繁琐,我于是封装了如下curl请求类. <?php /** * @author freephp * @date 2015- ...
- VS2015静态编译libcurl(C++ curl封装类)
一.最新libcurl静态编译教程(curl-7.51版/curl-7.52版) 1.安装perl,在官网下载,安装好以后,测试perl -v是否成功 2.编译openssl(已编译好的下载地址) p ...
- 《CURL技术知识教程》系列分享专栏
<CURL技术知识教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201737.html 文章 PHP采集相关教程之一 CUR ...
- CURL PHP模拟浏览器get和post
模拟浏览器get和post数据需要经常用到的类, 在这里收藏了几个不错的方法 方法一 <?php define ( 'IS_PROXY', true ); //是否启用代理 /* cookie文 ...
- PHP 优秀资源汇集(照搬)
文章目录 原文地址: https://shockerli.net/post/php-awesome/ GitHub: https://github.com/shockerli/php-awesome ...
- [php]微信测试号调取acces_token,自定义菜单以及被动响应消息
<?php /**自己写的 */ $wechatObj = new wechatCallbackapiTest(); $wechatObj->valid(); $wechatObj-> ...
- 跨域、curl、snoopy、file_get_contents()
定义:可以称为”信息采集/模拟登录”技术,可以实现对某个地址做请求,同时按照要求传递get或post参数. curl本身是php的一个扩展,同时也是一个利用URL语法规定来传输文件和数据的工具,支持很 ...
- curl 一个使用例子
#include <iostream> #define Main main #include <string> #include <assert.h> #inclu ...
随机推荐
- 无法启动此程序,因为计算机中丢失QtCored4.dll。尝试重新安装该程序以解决此问题。
在创建一个win32控制台应用程序时包含了QtCore中的头文件,并且程序编译成功(至少说明属性配置是正确的),运行此程序会出现弹出如下的一个系统错误: 这样的情况该怎么解决?提示说计算机中丢失了Qt ...
- Kafka文件存储机制
一.topic中partition存储分布 在本地的kafka中,我们只启动一个broker,创建两个topic:single-todo和single-todo-vip ,每个topic有两个part ...
- 如何实现keep-alive
路径: 由上图可知,keep-alive.js导出的对象(如下),作为一个属性将会注入到Vue.options.components中. const patternTypes = [String, R ...
- leetcode-179-Largest Number(理解规则,自定义cmp函数进行排序)
题目描述: 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说明 ...
- J01-Java IO流总结一 《异常捕获》
下面演示java中处理I/O操作时的异常的正确方式,总结自书籍,书名忘啦~ 先看一种不正确的方式 方式一: import java.io.FileInputStream; import java.io ...
- Neko and Aki's Prank CodeForces - 1152D (括号序列,dp)
大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化 ...
- android开发分辨率适配总结
重要概念 什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 什么是dp.dip.dpi.sp.px?他们之间的关系是什么? 什么是mdpi.hdpi.xdpi.xxdpi?如何计算和区分? 在下面的内容中我 ...
- Filter应用之-自动登录
自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录. 是指用户将用户的登录信息,人,保存到本地的文件中Cookie中. Name,value – 声明时 new Cooki ...
- 【java排序】冒泡排序、快速排序
冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地 进行直到没有再需要交换,也就是说该数列已经排序完成.这 ...
- WPF中触发器(Trigger、DataTrigger)使用动画最简单的方式EnterActions和ExitsActions
1.当鼠标移入后执行某个动画: <Style TargetType="{x:Type StackPanel}"> <Setter Property="R ...