当我第一次接触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的更多相关文章

  1. 在PowerShell中使用curl(Invoke-WebRequest)

    前言 习惯了windows的界面模式就很难转去命令行,甚至以命令行发家的git也涌现出各种界面tool.然而命令行真的会比界面快的多,如果你是一个码农. situation:接到需求分析bug,需要访 ...

  2. php中实现的一个curl批处理的实例

    curl是利用URL语法在命令行方式下工作的开源文件传输工具 本文在php中实现了的一个curl批处理的实例. 代码如下: header("Content-Type:text/html;ch ...

  3. PHP curl 函数

    转载http://sunking.sinaapp.com/archives/111 最近使用curl的时候,发现了一个比较好用的函数,当然是初级者适用的一个函数,就是curl_getinfo(), 在 ...

  4. curl -w,–write-out参数详解

    顾名思义,write-out的作用就是输出点什么.curl的-w参数用于在一次完整且成功的操作后输出指定格式的内容到标准输出. 输出格式由普通字符串和任意数量的变量组成,输出变量需要按照%{varia ...

  5. CURL HELP

    CURL下载 在windows的系统环境变量中,将CURL的路径(curl.exe存放的路径)复制到"Path"变量的结尾 Usage: curl [options...] < ...

  6. curl的登录总结

    demo1 <?php $curl=curl_init('http://www.baidu.com'); curl_exec($curl); curl_close($curl); ?> c ...

  7. php curl获取的数据不直接输出

    curl获取页面内容,不直接输出到页面 必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true curl_setopt($ch, CURLOPT_RETURNTRANSFER ...

  8. PHP的CURL

    使用CURL完成一个请求: 初始化连接句柄 设置CURL选项 执行并获取结果 释放CURL连接句柄 发送GET请求 function doGetRequest($url,$data,$timeout ...

  9. PHP curl报错“Problem (2) in the Chunked-Encoded data”解决方案

    $s = curl_init(); curl_setopt($s, CURLOPT_POST, true); curl_setopt($s, CURLOPT_POSTFIELDS, $queryStr ...

  10. 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 ...

随机推荐

  1. The usage method of reference with bibtex in Latex【latex中参考文献的使用方法】

    如何在latex中以Bibtex文件方式引用参考文献? 以IEEEtran模板为例: 1.制作bibtex参考文献库.方法如下: ①建立myreference.bib文件: ②在Google scho ...

  2. HW7.9

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  3. POJ1503: Integer Inquiry(连续多个大整数加法运算)

    #include<iostream> #include<cstring> using namespace std; string sum; ; string tool(stri ...

  4. CentOS 6.5 安装配置VSFTP

    1.下载安装VSFTP 首先查看当前系统是否已经安装VSFTP,若未安装则使用yum安装. chkconfig --list | grep vsftpd #查看是否安装 yum install vsf ...

  5. 怎么创建MongoDB数据库

    MongoDB didn’t provides any command to create “database“. Actually, you don’t need to create it manu ...

  6. linux内存负载分析

    衡量内存负载的一个很重要的指标就是页面置换的频率.当linux系统频繁的对页进行换进换出 的时候,说明物理内存不过,不得不进行频繁的置换页面. 使用vmstat(virtual memory stat ...

  7. HDU5781--ATM Mechine(概率dp)

    题意:Alice忘记了自己银行里存了多少钱,只记得在[0,k]之间.每次取钱如果余额足够就出钱,否则警告一次,警告超过w次就会把你抓起来,在不想被警察抓起来的前提下,Alice采取最优策略,求期望取钱 ...

  8. git http方式时保存密码

    一直使用ssh方式,但是git@osc的ssh只能pull,不能push  - -|||    htts方式保存密码老是忘记,每次提交代码都要输入密码烦死了.找到文章备忘: 转自:http://git ...

  9. delete table 和 truncate table

    delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where< ...

  10. 剑指OFFER之第一个只出现一次的字符(九度OJ1283)

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...