php curl数据传输神器
一、curl的概念:
curl (Client Url Library Functions)
定义: curl is a command line tool for transfering data with url syntax
即 使用 URL 语法传输数据的命令行工具
CURL是访问网络资源的工具
二、curl的使用场景
1、访问网页资源 (例如:编写网页爬虫)
2、访问WebService 数据接口资源 (例如:动态获取数据接口,天气,号码归属地等)
3、下载FTP服务器里面的文件资源等 (例如:下载FTP服务器里面的文件)
所有的网络资源都可以用CRUL访问和下载到
三、在PHP中使用cUrl
windows: 在cmd中执行命令
php -i // 所有php的设置都会被打印出来, i 代表 infomations的意思
然后 右键 -> 编辑 -> 查找->输入 cUrl ,可以看到类似如下信息:
说明cUrl 可用,且版本为 7.25.0
Linux:输入命令:
php -i | grep cUrl
几乎所有的工具都需要经历:
去初始化它 -> 去使用它 -> 去关闭它
curl也是这样。
curl_exec() 把发送请求和接收数据都一起做了。
四、使用示例
1、一个最简单的 curl 示例(编写一个网页爬虫,获取百度首页的 html)
$curl = curl_init('www.baidu.com'); // 初始化
curl_exec($curl); // 执行
curl_close($curl); // 关闭
这样子会得到百度首页的 html 代码,并且会直接输出,用浏览器显示的话,和输入www.baidu.com显示的内容一模一样。
2、对网页代码做一些修改(例如将百度改为慕课)
$url = 'www.baidu.com';
$curl = curl_init(); // 初始化 curl
curl_setopt($curl,CURLOPT_URL,$url); // 设置访问的 url
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); // CURLOPT_RETURNTRANSFER 设为 tuue,表示执行结果不直接打印出来,以便对结果做一些后续的处理
$output = curl_exec($curl); //执行
curl_close($curl); // 关闭 curl
str_replace('百度','慕课',$output); // 对返回结果做替换
3、访问 WebService 数据接口资源(查询深圳的天气)
使用的天气接口为http://www.webxml.com.cn/WebServices/WeatherWebService.asmx,虽说是免费的,但是有使用次数限制
$url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName';
$data = 'theCityName=深圳'; // 多个参数用 & 连接
$httpHeader = array(
'Content-type: application/x-www-form-urlencoded;charset=utf-8', // 数据被编码为名称/值对的形式,字符集为utf-8
'content-length: '.strlen($data), // post发送都需要指定一下数据的长度
);
$curl = curl_init(); // 初始化 curl
curl_setopt($curl,CURLOPT_URL,$url); // 设置访问的 url
curl_setopt($curl,CURLOPT_HEADER,0); // 不设置 header
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); // CURLOPT_RETURNTRANSFER 设为 tuue,表示执行结果不直接打印出来,以便对结果做一些后续的处理
// post请求,下面这 3 行是重点
curl_setopt($curl,CURLOPT_POST,true); // 通过 post 的方式请求
curl_setopt($curl,CURLOPT_POSTFIELDS,$data); // 设置请求的参数
curl_setopt($curl,CURLOPT_HTTPHEADER,$httpHeader); // 设置 httpheader
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //声明浏览器用于 HTTP 请求的用户代理头的值。简单来说,就是“声明用什么浏览器来打开目标网页”,当抓取网页资源不能正确返回结果时,可以加入这一项
$output = curl_exec($curl); //执行
if(! curl_errno($curl)){ // 如果执行的过程中出错了,将错误打印出来
echo $output;
//$info = curl_getinfo($curl); // 返回的是数组格式
//print_r($info);
}else{
echo 'curl error:'.curl_error($curl);
}
curl_close($curl); // 关闭 curl
CURLOPT_HEADER 和 CURLOPT_HTTPHEADER 的区别:
简单来说 CURLOPT_HEADER是设置输出的,CURLOPT_HTTPHEADER是设置输入的
4、从ftp服务器下载文件
/*
* 从FTP服务器下载一个文件到本地
* 假如服务器地址为:ftp:192.168.1.100/downloaddemo.txt
* */
$url = 'ftp:192.168.1.100/downloaddemo.txt';
$curl = curl_init(); // 初始化 curl
curl_setopt($curl,CURLOPT_URL,$url); // 设置访问的 url
curl_setopt($curl,CURLOPT_HEADER,0); // 不设置 header
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); // CURLOPT_RETURNTRANSFER 设为 tuue,表示执行结果不直接打印出来,以便对结果做一些后续的处理
curl_setopt($curl,CURLOPT_TIMEOUT,300); // 设置下载超时时间
curl_setopt($curl,CURLOPT_USERPWD,'test_username:test_pwd'); // 设置登录ftp服务器的用户名和密码
// 文件下载下来后保存的位置
$outfile = fopen('dest.txt','wb');
curl_setopt($curl,CURLOPT_FILE,$outfile);
$output = curl_exec($curl); //执行
if(! curl_errno($curl)){ // 如果执行的过程中出错了,将错误打印出来
echo $output;
}else{
echo 'curl error:'.curl_error($curl);
}
curl_close($curl); // 关闭 curl
5、将本地文件上传至 ftp 服务器
/*
* 将本地文件上传至 ftp 服务器
* 假如服务器地址为:ftp:192.168.1.100/server_upload_file.txt
* */
$url = 'ftp:192.168.1.100/server_upload_file.txt';
$localfile = 'localfile.txt';
$fp = fopen($localfile,'r');
$curl = curl_init(); // 初始化 curl
curl_setopt($curl,CURLOPT_URL,$url); // 设置访问的 url
curl_setopt($curl,CURLOPT_HEADER,0); // 不设置 header
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); // CURLOPT_RETURNTRANSFER 设为 tuue,表示执行结果不直接打印出来,以便对结果做一些后续的处理
curl_setopt($curl,CURLOPT_TIMEOUT,300); // 设置下载超时时间
curl_setopt($curl,CURLOPT_USERPWD,'test_username:test_pwd'); // 设置登录ftp服务器的用户名和密码
// 以下三行为文件上传的关键设置
curl_setopt($curl,CURLOPT_UPLOAD,1); // 文件上传的操作,CURLOPT_UPLOAD 必须设为1
curl_setopt($curl,CURLOPT_INFILE,$fp); // 指定上传的文件(所打开文件的句柄)
curl_setopt($curl,CURLOPT_INFILESIZE,filesize($localfile)); // 告诉 curl 上传文件的大小,让 curl 知道大概需要上传多长时间
$output = curl_exec($curl); //执行
if(! curl_errno($curl)){ // 如果执行的过程中出错了,将错误打印出来
echo 'uploaded successfully';
}else{
echo 'curl error:'.curl_error($curl);
}
curl_close($curl); // 关闭 curl
附:一个 curl 的常规方法:
/**
* @Purpose : curl 方法
* @Params : string $url 访问地址
* : boole $https 是否为https方式,true代表是
* : string $method 是get还是post
* : array/json $data 是传键值对的数组还是传json,跟header的设置有关
* : array $httpHeader 当为post方式访问的时候,需要设置header
* @Author : daicr
* @Time : 2018-11-20
*/
public function httpCurl($url,$https=false,$method='get',$data,$httpHeader)
{
$curl = curl_init(); // 初始化 curl
curl_setopt($curl,CURLOPT_URL,$url); // 设置访问的 url
curl_setopt($curl,CURLOPT_HEADER,0); // 不设置 输出header
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); // CURLOPT_RETURNTRANSFER 设为 tuue,表示执行结果不直接打印出来,以便对结果做一些后续的处理
curl_setopt($curl, CURLOPT_VERBOSE , true); // CURL报告每一件意外的事情,设置这个选项为一个非零值 //http 基础权限,当需要传账号和密码时使用
//curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
// curl_setopt($curl, CURLOPT_USERPWD, "admin:123456"); // 若为 https ,不验证
if($https){
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
}
if($method == 'post'){
curl_setopt($curl,CURLOPT_POST,true); // 通过 post 的方式请求
curl_setopt($curl,CURLOPT_POSTFIELDS,$data); // 设置请求的参数
curl_setopt($curl,CURLOPT_HTTPHEADER,$httpHeader); // 设置 httpheader
//curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //声明浏览器用于 HTTP 请求的用户代理头的值。简单来说,就是“声明用什么浏览器来打开目标网页”,当抓取网页资源不能正确返回结果时,可以加入这一项
}
curl_setopt($curl, CURLOPT_TIMEOUT,30); // curl的最长执行时间为 30s
$output = curl_exec($curl); //执行
if(! curl_errno($curl)){ // 如果执行的过程中出错了,将错误打印出来
return $output;
}else{
$curlError = 'curl error: ' . curl_error($curl);
$this->writeLog($curlError,$this->logDir,$this->fileName); // 写日志的方法见 https://www.cnblogs.com/chrdai/p/7082146.html
return false;
}
curl_close($curl); // 关闭 curl
}
如果是 post 上传,通常需要设置 httpheader
常用的 httphader有:
第一种:用键值对的方式上传:
$httpHeader = array(
'Content-type: application/x-www-form-urlencoded;charset=utf-8', // 数据被编码为名称/值对的形式,字符集为utf-8
'content-length: '.strlen($data), // post发送都需要指定一下数据的长度
);
第二种:用json的格式上传:
$httpHeader = array(
'Content-Type: application/json; charset=utf-8', // 设置为json的格式
'content-length: '.strlen($data), // post发送都需要指定一下数据的长度
);
更详细的关于 crul 的教学,大家可以参看以下这个视频讲解:https://www.imooc.com/video/2034
如有转载,请注明出处:http://www.cnblogs.com/chrdai/p/8974059.html
php curl数据传输神器的更多相关文章
- PHP 中的 cURL 爬虫实战基础
最近准备入手 PHP 爬虫,发现 PHP 的 cURL 这一知识点不可越过.本文探讨基础实战,需要提前了解命令行的使用并会进行 PHP 的环境搭建. cURL 的概念 cURL,Client URL ...
- php curl使用总结(一)
今天和第三方支付做对接的时候,在本地用wamp(php版本5.4.14)运行他们的支付demo的时候,报了一个错误.loadXML函数中不能传空值.排查代码的时候,发现他们用了curl,我以前也接触过 ...
- PHP之CURL实现含有验证码的模拟登录
博主最近在为学校社团写一个模拟登录教务系统来进行成绩查询的功能,语言当然是使用PHP啦,原理是通过php数据传输神器---curl扩展,向学校教务系统发送请求,通过模拟登录,获取指定url下的内容. ...
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)
linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl) 分类: linux2011-10-10 13:21 8773人阅读 评论(1) 收藏 举 ...
- cmder 神器 +curl
cmder 神器 https://www.jianshu.com/p/7a706c0a3411 curl https://www.cnblogs.com/zhuzhenwei918/p/6781314 ...
- php使用curl实现get和post请求的方法,数据传输urldecode和json
PHP支持CURL库,利用URL语法规定来传输文件和数据的工具,支持很多协议,包括HTTP.FTP.TELNET等. 优点:是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS.CURL ...
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- shell神器curl命令的用法 curl用法实例笔记
shell神器curl命令的用法举例,如下: ##基本用法(配合sed/awk/grep) $curl http://www.jquerycn.cn ##下载保存 $curl http://www.j ...
- php爬虫神器cURL
cURL 网页资源(编写网页爬虫) 接口资源 ftp服务器文件资源 其他资源 static public function curl($url, $data = array(), $timeout = ...
随机推荐
- 在Ubuntu内制作自己的VOC数据集
一.VOC数据集的简介 PASCAL VOC为图像的识别和分类提供了一整套标准化的优秀数据集,基本上就是目标检测数据集的模板.现在有VOC2007,VOC2012.主要有20个类.而现在主要的模型评估 ...
- python字符串之split
函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...
- dump增加的表数据
备份mysql数据库表中,增加的部分 前提条件: 备份库和正式库表结构一样: 表名不一样可以改: 备份库:192.168.1.10 正式库:192.168.1.11 获取当前"备份" ...
- 一脸懵逼学习Hive(数据仓库基础构架)
Hive是什么?其体系结构简介*Hive的安装与管理*HiveQL数据类型,表以及表的操作*HiveQL查询数据***Hive的Java客户端** Hive的自定义函数UDF* 1:什么是Hive(一 ...
- Genius ACM
题解: 发现匹配一定会选最大和最小匹配,确定左右端点之后nlogn排序后算 比较容易想到二分 最坏情况每次1个 $n^2*(logn)^2$ 没错暴力的最差复杂度是$n^2*logn$的 发现长度与次 ...
- 【BZOJ2402】陶陶的难题II 分数规划+树链剖分+线段树+凸包
题解: 首先分数规划是很明显的 然后在于我们如何要快速要求yi-mid*xi的最值 这个是看了题解之后才知道的 这个是斜率的一个基本方法 我们设y=mid*x+z 那么显然我们可以把(x,y)插入到一 ...
- [转]PyCharm安装及使用
https://www.jianshu.com/p/042324342bf4 PyCharm 搭建环境 1.win10_X64,其他Win版本也可以. 2.PyCharm版本:Professional ...
- ab访问并发测试简要步骤
工具: 1)ab -n 总访问次数 -c 并发用户数 目标url 查询某一个工具是哪个软件包安装的 rpm -qf 2)loadrunner 可视化 3)webbench 制作指定大小页面: ...
- linux后台执行./run.py提示python syntax error near unexpected token `('
python脚本中的#!/usr/bin/python 估计有不少人注意过一些python脚本开头有这么行东东: #!/usr/bin/python 它是用来干嘛的?貌似没有它对脚本功能也没啥 ...
- UOJ#351. 新年的叶子 概率期望
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ351.html 题目传送门 - UOJ351 题意 有一个 n 个节点的树,每次涂黑一个叶子节点(度为 1 ...