PHP之curl
当我第一次接触curl的时候,看文档,以及网上search各种资料,官方(http://cn2.php.net/manual/en/intro.curl.php)的解释是,这是某大牛写的一个libcurl库,PHP支持该扩展库,允许我们以各种不同的协议(http、https、ftp、telnet、file...)访问各种不同的服务器,支持post、put、ftp或基于表单的文件上传,支持cookie、代理等等。
好像还是似懂非懂,我觉得最简单的解释是,curl是一个工具集,由libcurl扩展库支持,包含一些函数,使用这些函数可以模拟我们来访问某些地址,也就是,我们手动在浏览器地址栏里面输入http://www.baidu.com,来访问百度,curl就可以代替这种手动操作,以程序的形式来实现这一过程,这个操作、过程得到的结果,是浏览器给了我们一个百度搜索的首页。
既然curl是一个工具集,有很多函数可供调用,可以想象成,在地址栏输入URL(可能会带一些参数),当输入完点击回车的时候,相当于调用了某些函数,这些函数在百度某台或某几台服务器上的脚本上写着,函数运行完后会有某种效果,比如返回了值,或者没返回值,或者打印了一些东西,在这里呈现了一个页面给你,而curl能实现的功能,比简单展示一个页面多得多,这些各自不同的功能是通过curl_setopt函数来实现的。比如在接SDK的时候,别人提供的是访问地址形式的API,这时curl就大显身手。
1.get实现
<?php
$url = 'http://www.somesite.com';
$data = array('username'=>'Peter', 'password'=>12345);
function get($url, $data = array()){
$ch = curl_init(); // 初始化一个curl资源类型变量 /*设置访问的选项*/
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 启用时会将服务器返回的Location: 放在header中递归的返回给服务器,即允许跳转
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); // 将获得的数据返回而不是直接在页面上输出
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP ); // 设置访问地址用的协议类型为HTTP
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); // 访问的超时时间限制为15s
$url = url.'?'.http_build_query($data);
curl_setopt($ch, CURLOPT_URL, $url); // 设置即将访问的URL $result = curl_exec($ch); // 执行本次访问,返回一个结果
curl_close($ch); // 关闭
// ... // 针对结果的正确与否做一些操作
return $result;
}
// $result = get(%url, $data); // 调用
2.post实现
<?php
function post($url, $data = array()){
$ch = curl_init(); curl_setopt($ch, CURLOPT_POST, true); // 设置为post传递形式
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 设置post传递的数据
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置数据以文件流的形式返回
curl_setopt($ch, CURLOPT_USERAGENT, ''); // 将用户代理置空
curl_setopt($ch, CURLOPT_HEADER, false); // 设置不显示头信息 $result = curl_exec($ch);
$info = curl_getinfo($ch); // 获取本次访问资源的相关信息
curl_close($ch);
return $result;
}
比如把URL参数传递为http://www.baidu.com,data参数传递为array('uid'=>'122139342', 'password'=>'wfiw7482f'),此时var_dump一下$result,如下
返回了一个字符串,当然这只是测试。如果把curl_setopt的CURLOPT_HEADER设置为true,返回结果中将包含头信息,如下
curl_getinfo函数获取的事本次访问资源句柄的信息,大概有访问的URL、访问状态码、头大小、连接时间、跳转的URL、访问的本地IP和接口等等,如下
3.文件上传
一种方式是同上面的post传递方法,文件也可作为post数据传递,只是在上传的post数据里边要包含上传文件的路径,在curl_setopt($ch, CURLOPT_POSTFIELDS, $data)中,当传递data参数时可以是这样的data,$data = array('upload'=>'D://1.txt'),放一个路径,post传递时回去寻找这个路径的文件。
另一种是通过ftp协议上传,通过php支持的ftp扩展库可以实现,curl也可做到
<?php
function ftpUpload($url, $filepath){ if(false == ($file = fopen($filepath, 'r'))){ // 文件路径,生成一个指向文件的句柄
echo 'open file failed!';
return false;
} $ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_INFILE, $file); // 设置读取文件的地址
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filepath)); // 设置上传文件大小
curl_setopt($ch, CURLOPT_TRANSFERTEXT, true); // 对于ftp协议上传时,使用文本模式,在win系统上面,stdout不再是二进制
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); // 设置为无限制等待连接 $ret = curl_exec($ch);
curl_close($ch); return $ret;
}
这里的url参数要传递一个ftp协议,而不是常用http
暂时到这,日后再补。
PHP之curl的更多相关文章
- 在PowerShell中使用curl(Invoke-WebRequest)
前言 习惯了windows的界面模式就很难转去命令行,甚至以命令行发家的git也涌现出各种界面tool.然而命令行真的会比界面快的多,如果你是一个码农. situation:接到需求分析bug,需要访 ...
- php中实现的一个curl批处理的实例
curl是利用URL语法在命令行方式下工作的开源文件传输工具 本文在php中实现了的一个curl批处理的实例. 代码如下: header("Content-Type:text/html;ch ...
- PHP curl 函数
转载http://sunking.sinaapp.com/archives/111 最近使用curl的时候,发现了一个比较好用的函数,当然是初级者适用的一个函数,就是curl_getinfo(), 在 ...
- curl -w,–write-out参数详解
顾名思义,write-out的作用就是输出点什么.curl的-w参数用于在一次完整且成功的操作后输出指定格式的内容到标准输出. 输出格式由普通字符串和任意数量的变量组成,输出变量需要按照%{varia ...
- CURL HELP
CURL下载 在windows的系统环境变量中,将CURL的路径(curl.exe存放的路径)复制到"Path"变量的结尾 Usage: curl [options...] < ...
- curl的登录总结
demo1 <?php $curl=curl_init('http://www.baidu.com'); curl_exec($curl); curl_close($curl); ?> c ...
- php curl获取的数据不直接输出
curl获取页面内容,不直接输出到页面 必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true curl_setopt($ch, CURLOPT_RETURNTRANSFER ...
- PHP的CURL
使用CURL完成一个请求: 初始化连接句柄 设置CURL选项 执行并获取结果 释放CURL连接句柄 发送GET请求 function doGetRequest($url,$data,$timeout ...
- PHP curl报错“Problem (2) in the Chunked-Encoded data”解决方案
$s = curl_init(); curl_setopt($s, CURLOPT_POST, true); curl_setopt($s, CURLOPT_POSTFIELDS, $queryStr ...
- php获得远程信息到本地使用的3个函数:file_get_contents和curl函数和stream_get_contents
1:file_get_contents echo file_get_contents("http://www.php.com/index.php"); 2:curl funct ...
随机推荐
- OpenCV2.3.1中tbb_debug.dll is missing的解决办法
方法1: 将\opencv\build\common\tbb\ia32目录下的tbb.dll复制改名为tbb_debug.dll 方法2: 若方法1失效,请将\openc ...
- CodeForces 456D&455B--A Lot of Games(Trie+博弈)
题意:给n个字符串.进行k次游戏.每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为集合中某字符串的前缀,不能操作者输,新一轮由上一句输的人先手. 题解: #看到此题毫无头绪,队友写 ...
- Java网络编程(UDP协议-聊天程序)
接收端: package WebProgramingDemo; import java.net.DatagramPacket; import java.net.DatagramSocket; publ ...
- hdoj 3371 Connect the Cities
Connect the Cities Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 【Android】JSONArray的合并
在Android开发过程中,需要处理解析服务器JSON数据时,或需要进行两个或多个JSONArray合并操作. 比如在进行LIstView的动态更新时. 在此提供一种JSONArray合并的方法,方便 ...
- SVN遇到的几个错误问题解决办法
1.svn更新被锁 清理之后陷入死循环问题 Attempted to lock an already-locked dir svn: Working copy 'E:\Workspaces\eclip ...
- 关于 JavaScript 数据类型判断
在 JavaScript 中,有 undefined.null.number.string.boolean 五种基本数据类型,另外,有一种复杂数据类型 object ,类似于 C# 中值类型.引用类型 ...
- 08重编终极版《东邪西毒:终极版》DVD粤语中字
1.东邪西毒].Ashes.of.Time.1994.384p.DVDRip.x264.ac3-DTMM.mkv 这个版本最清晰 ,可惜删减了,只有87分钟,粤语,1.4G. 2.东邪西毒(初始版). ...
- IOS 在Ipad 横屏 上使用UIImagePickerController
转载前请注明来源:http://www.cnblogs.com/niit-soft-518/p/4381328.html 最近在写一个ipad的项目,该项目必须是横屏.进入正题,有一项功能是要调用系统 ...
- STL 源代码剖析 算法 stl_algo.h -- lower_bound
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie lower_bound(应用于有序区间) ------------------------- ...