php之curl // 拼装参数$url = $url . '?' . http_build_query($data);

当我第一次接触curl的时候,看文档,以及网上search各种资料,官方( http://cn2.php.net/manual/zh/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就大显身手。

GET实现

<?php $url = 'http://www.somesite.com'; $data = array('username' => 'Peter', 'password' => 12345); function get($url, $data = array()) { // 初始化一个curl资源类型变量 $ch = curl_init(); /*设置访问的选项*/ // 启用时会将服务器返回的Location: 放在header中递归的返回给服务器,即允许跳转 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 将获得的数据返回而不是直接在页面上输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置访问地址用的协议类型为HTTP curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP); // 访问的超时时间限制为15s curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); // 拼装参数 $url = $url . '?' . http_build_query($data);

// 设置即将访问的URL curl_setopt($ch, CURLOPT_URL, $url); // 执行本次访问,返回一个结果 $result = curl_exec($ch); // 关闭 curl_close($ch); // 针对结果的正确与否做一些操作 // ... return $result; } // 调用 $result = get($url, $data); ?>

POST实现

<?php
function post($url, $data = array()) {
    $ch = curl_init();

    // 设置为post传递形式
    curl_setopt($ch, CURLOPT_POST, true);
    // 设置post传递的数据
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
    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和接口等等,如下

Array
(
    [url] => http://www.baidu.com/?uid=122139342&password=wfiw7482f
    [content_type] => text/html
    [http_code] => 200
    [header_size] => 689
    [request_size] => 85
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.055767
    [namelookup_time] => 0.004591
    [connect_time] => 0.027635
    [pretransfer_time] => 0.027714
    [size_upload] => 0
    [size_download] => 14613
    [speed_download] => 262036
    [speed_upload] => 0
    [download_content_length] => 14613
    [upload_content_length] => 0
    [starttransfer_time] => 0.054213
    [redirect_time] => 0
    [redirect_url] =>
    [primary_ip] => 115.239.211.110
    [certinfo] => Array
        (
        )

    [primary_port] => 80
    [local_ip] => 192.168.196.80
    [local_port] => 54332
)

文件上传

一种方式是同上面的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));
    // 对于ftp协议上传时,使用文本模式,在win系统上面,stdout不再是二进制
    curl_setopt($ch, CURLOPT_TRANSFERTEXT, true);
    // 设置为无限制等待连接
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);  

    $ret = curl_exec($ch);
    curl_close($ch);

    return $ret;
}
?>

这里的url参数要传递一个ftp协议,而不是常用http。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值