php中的curl使用入门教程和常见用法实例


Posted in PHP onApril 10, 2014

一、curl的优势

你也许会说,在php中可以很容易的获取某个url的内容,只要通过file_get_contents,file或者readfile函数就能轻松实现,根本不必使用cURL:

        $content = file_get_contents("http://www.360weboy.com");
        $lines = file("http://www.360weboy.com");
        readfile("http://www.360weboy.com");

没错,以上函数在某些情况下使用起来确实很方便,但是我感觉这几个函数不够灵活,也没法进行错误处理。而且,如果遇到要在php程序中向某个服务器提交表单数据,上传文件,处理cookies或者认证等任务时,以上三个函数根本无法胜任。这个时候,cURL就体现它的价值了。

cURl不但支持很多的网络协议,而且提供了关于url请求的具体信息,很强大!

二、curl的简单使用步骤

要使用cURL来发送url请求,具体步骤大体分为以下四步:

1.初始化
2.设置请求选项
3.执行一个cURL会话并且获取相关回复
4.释放cURL句柄,关闭一个cURL会话

    
        // 1. 初始化一个cURL会话
        $ch = curl_init();        // 2. 设置请求选项, 包括具体的url
        curl_setopt($ch, CURLOPT_URL, "http://www.360weboy.com");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        // 3. 执行一个cURL会话并且获取相关回复
        $response = curl_exec($ch);
        // 4. 释放cURL句柄,关闭一个cURL会话
        curl_close($ch);
   
cURL之所以强大,正是体现在第二个步骤中。你可以通过curl_setopt灵活地设置请求选项,这里面有很多的可选项,具体可以参考http://cn2.php.net/manual/zh/function.curl-setopt.php

三、错误处理

在上述代码中,你也可以增加错误处理的代码:

        $response = curl_exec($ch);

        if ($response  === FALSE) {
          echo "cURL 具体出错信息: " . curl_error($ch);
        }
   
注意了,在做上述判断时务必要使用===,因为请求的回复可能是空字符串,curl在请求出错的情况下回返回FALSE值,所以我们必须使用===,而不是==。

四、获取curl请求的具体信息

在执行一个cURL请求后,你也可以使用curl_getinfo获取该请求的具体信息:

        curl_exec($ch);
        $curl_info= curl_getinfo($ch);
        echo "收到的http回复的code为: {$curl_info['http_code']}";
   
上述$curl_info是一个关联数组,可以从中获取很多的具体请求信息。参考http://cn2.php.net/manual/zh/function.curl-getinfo.php

五、使用curl发送post请求

我们在前面说过,在向某个url发送get请求的话,没有必要使用cURL来发送get请求,可以使用比较便捷的file_get_contents函数来完成请求。但是,一般地,我们在提交某个表单的时候,数据是通过post请求的内容区域来提交的,而不是通过url参数来传递的, 这种情况下,我们应该使用灵活的cURL来模拟发送post请求。

现在,让我们使用cURL来模拟发送一个post请求到post.php脚本,提交几个数据到post.php,然后在post.php中输出post请求中的数据。示例代码如下:

       $url = "http://www.360weboy.me/post.php";

        $post_data = array (
          "blog_name" => "360weboy",
          "blog_url" => "http://www.360weboy.com",
          "action" => "Submit"
        );
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 设置请求为post类型
        curl_setopt($ch, CURLOPT_POST, 1);
        // 添加post数据到请求中
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
        // 执行post请求,获得回复
        $response= curl_exec($ch);
        curl_close($ch);
        echo $response;
 
  
以上请求发送到post.php中后,通过print_r($_POST)输出后,以上示例代码会输出如下回复:
        Array
        (
            [blog_name] => 360weboy
            [blog_url] => http://www.360weboy.com
            [action] => Submit
        )
   
正如我们看到的,cURL成功发送post请求到post.php,提交了一些数据,并且收到了相应的来自post.php的回复,最后输出回复。上例虽然简单,但是充分演示了cURL发送post请求的便捷及强大之处,你可以在curl_setopt上做文章。

六、文件上传

下面来看下如果通过cURL发送post请求来实现文件上传。就拿深入浅出PHP下的文件上传中的文件上传例子来演示,在深入浅出php下的文件上传中,是通过表单的提交来实现文件上传的,那么通过cURL怎么来实现呢?

 

   
       $url = "http://www.360weboy.me/upload.php";
        $post_data = array (
          "attachment" => "@E:/jackblog/boy.jpg"
        );
        //初始化cURL会话
        $ch = curl_init();
        //设置请求的url
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //设置为post请求类型
        curl_setopt($ch, CURLOPT_POST, 1);
        //设置具体的post数据
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
        $response = curl_exec($ch);
        curl_close($ch);
        print_r($response);
   
通过以上示例代码,可以将我本地机器上的boy.jpg上传到本地服务器的upload.php中,如果在upload.php输出上传的具体信息的话,以上示例代码最后的输出的回复为:
    
        Array
        (
            [attachment] => Array
                (
                    [name] => boy.jpg
                    [type] => application/octet-stream
                    [tmp_name] => D:\xampp\tmp\phpF27D.tmp
                    [error] => 0
                    [size] => 11490
                )        )
 
  
由此可见,如果你要通过cURL来上传文件的话,只需要将上传的文件路径作为post数据设置到curl请求中,并且在路径前面加上@符合。

七、文件下载

上述将了文件上传,同样的也可以使用curl来自动地完成文件的下载以及保存。有一点要补充下,在执行一个curl请求时,如果你需要获取返回的内容,而不是直接输出返回的内容的话,别忘记使用下面的代码设置,因为curl的默认是输出请求的回复内容:

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   

假如在360weboy的服务器根目录下面有一个test.zip文件,我们需要将其下载下来,并且保存到本地文件中,就可以尝试使用下面的代码来实现:
        //设置请求的下载文件的url
        $url  = 'http://www.360weboy.com/test.zip';
        //保存到本地的文件路径
        $path = 'local/path/to/test.zip';
        //初始化请求,设置请求,获取回复,关闭会话
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        curl_close($ch);
        //将文件内容写入本地文件
        file_put_contents($path, $data);
   
注意:我以上省略了错误处理方面的代码,只是简单做个示例, 在实际中,你还需要通过curl_getinfo函数来进行错误处理!

上述代码对于下载比较大型的文件是不适用的,因为需要先将文件读取到内存中,等所有内容都读取完毕,然后再写入到本地硬盘中。即使php中设置的memory limit非常大,这种情况对性能的影响也是很大的。所以,我们对于大型文件的下载,应该让curl来接管这个任务,实现边下载,边写入的处理,这样的话,就没什么问题了。请看下述代码:

        $url  = 'http://www.360weboy.com/test.zip';
        $path = 'local/path/to/test.zip';
        // 打开本地文件
        $fp = fopen($path, 'w');
        // 告诉curl本地文件句柄
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_exec($ch);
        curl_close($ch);
        fclose($fp);
   
在上述代码中,我们先打开个本地文件,并将文件句柄设置到curl中,然后让curl一边读取远程数据,一边写入到本地文件中。因为我们不需要在程序中获取远程回复的内容了,所以只要执行请求就可以。

八、http 验证

如果服务器端需要验证请求,可以通过类似一下示例代码来实现:

        $url = "http://www.360weboy.com/users/";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 设置用户名以及密码
        curl_setopt($ch, CURLOPT_USERPWD, "username:password");
        // 设置重导向
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
        $response = curl_exec($ch);
        curl_close($ch);
   
九、通过代理发送请求

cURL还可以通过代理服务器来向发送请求,请看一下示例代码:
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,'http://www.360weboy.com');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 设置代理ip地址
        curl_setopt($ch, CURLOPT_PROXY, '222.73.173.50:8080');
        // 要验证的话,这里设置用户名以及密码
        curl_setopt($ch, CURLOPT_PROXYUSERPWD,'username:password');
        $response = curl_exec($ch);
        curl_close ($ch);
  
十、发送json数据

最后,我们来看下通过cURL来想服务器端发送json数据。具体的代码如下:

 

   
        $url = 'http://www.360weboy.me/json.php';        // 建立json字符串
        $data = array('site' => '360weboy', 'url' => 'http://www.360weboy.com','email'=>'360weboy@gmail.com');
        $json_string = json_encode($data);
        $ch=curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 通过post请求发送上述json字符串
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, array('data'=>$json_string));
        $response = curl_exec($ch);
        curl_close($ch);
        echo $response;
 
 
大家可以看到,上述请求是发送到我的本地服务器的json.php下,我在该文件中使用json_decode来将接受到的json字符串转换为对象,然后输出其中的email字段,代码如下:
        $json_data = json_decode($_POST['data']);

        echo $json_data->email;
   
在上述代码中接受的json字符串为:
        '{"site":"360weboy","url":"http:\/\/www.360weboy.com","email":"360weboy@gmail.com"}'
   
经过json_decode以后,就转换为php中的数据格式,成为了一个对象,所以可以通过$json_data->email来访问其中email字段的值,最后也就是输出360weboy@gmail.com。你可以使用上述代码测试一下。

如果通过以下php数组生成json字符串的话:

        $data = array('360weboy', 'http://www.360weboy.com', '360weboy@gmail.com');
   
所生成的json字符串如下:
        '["360weboy","http:\/\/www.360weboy.com","360weboy@gmail.com"]'
   
上述json字符串在经过json_decode处理后,就会变成php中的数组格式,如果要获取email的话,就可以通过$json_data[2]来访问。

十一、总结

在这篇博文中只是列举了一些cURL的用途,其中示例代码是比较简单的。但是,相信你看完后应该有使用cURL的冲动了吧! 那就自己去找相关资料,手册进行测试吧!

好了,就写到这里吧!谢谢你的耐心阅读!

PHP 相关文章推荐
PHP获取当前文件所在目录 getcwd()函数
May 13 PHP
php中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
php长字符串定义方法
Jul 12 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
Mar 18 PHP
PHP实现批量上传单个文件
Dec 29 PHP
简单谈谈php浮点数精确运算
Mar 10 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP中PDO事务处理操作示例
May 02 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 PHP
PHP网页缓存技术优点及代码实例
Jul 29 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 #PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 #PHP
php实现批量下载百度云盘文件例子分享
Apr 10 #PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 #PHP
PHP按行读取、处理较大CSV文件的代码实例
Apr 09 #PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 #PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 #PHP
You might like
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
php快递单号查询接口使用示例
2014/05/05 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
php生成二维码
2015/08/10 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
pycharm 使用心得(四)显示行号
2014/06/05 Python
介绍Python中的__future__模块
2015/04/27 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
python中的随机函数random的用法示例
2018/01/27 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
生日宴会答谢词
2014/01/09 职场文书
医药销售求职信范文
2014/02/01 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
文员岗位职责范本
2015/04/16 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
详解JAVA中的OPTIONAL
2021/06/14 Java/Android