PHP中CURL的几个经典应用实例


Posted in Javascript onJanuary 23, 2015

1、cURL请求的基本步骤:

(1)初始化
(2)设置选项,包括URL
(3)执行并获取HTML文档内容
(4)释放cURL句柄

<?php

    //1、初始化

    $ch = curl_init();
    //2、设置选项,包括URL

    curl_setopt($ch, CURLOPT_URL, "http://www.cnblogs.com/it-cen/");
    //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //启动时会将头文件的信息作为数据流输出

    curl_setopt($ch, CURLOPT_HEADER, 1);
    //3、执行并获取HTML文档内容

    curl_exec($ch);
    //4、释放句柄

    curl_close($ch);
    echo $ch;
?>

注意:第二步最重要,也就是curl_setopt()函数

我们可以加一段检查错误的语句,这里要注意用的是"===false",这是为了区分空输出和布尔值false

$output = curl_exec($ch);

 

     if ($output === false) {

         echo "cURL Error:".curl_error($ch);

     }

curl_getinfo()函数返回cURL执行后这一请求相关的信息,这对调试和排错很有用:

 curl_exec($ch);

     $info = curl_getinfo($ch);

     echo '<pre>';

     print_r($info);    

     echo '</pre>';

返回的数据

Array

(

    [url] => http://www.cnblogs.com/it-cen/

    [content_type] => text/html; charset=utf-8

    [http_code] => 200

    [header_size] => 312

    [request_size] => 61

    [filetime] => -1

    [ssl_verify_result] => 0

    [redirect_count] => 0

    [total_time] => 0.172

    [namelookup_time] => 0.016

    [connect_time] => 0.063

    [pretransfer_time] => 0.063

    [size_upload] => 0

    [size_download] => 14658
 <span style="color: #ff0000;"> //请求的数据大小</span>

    [speed_download] => 85220



    [speed_upload] => 0

    [download_content_length] => 14658

    [upload_content_length] => 0

    [starttransfer_time] => 0.125

    [redirect_time] => 0

    [certinfo] => Array

        (

        )

 

    [redirect_url] => 

)

2、这些信息在调试很有用,例如在cURL抓取的时候,可能由于网络等原因,时常出现抓取数据不完整的情况,这是我们可以通过所获取的数据计算filesize,然后和curl_getinfo()获取的进行比较,如果大小相等,就认定下载正确,否则进行重复尝试。

 下面我们看一个抓取图片的例子:
 

 <?php

    header("Content-Type: image/png");
    //1、初始化

    $ch = curl_init();
    //2、设置选项,包括URL

    curl_setopt($ch, , CURLOPT_URL, "http://img04.taobaocdn.com/tfscom/TB1omaTHXXXXXajXVXXtKXbFXXX.png");

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_HEADER, 1);
    //3、执行并获取内容

    $res = curl_exec($ch);
    //获取信息

    $info = curl_getinfo($ch);
    //4、释放资源

    curl_close($ch);
    file_put_contents("d:/aa.png", $res);
    $size = filesize("d:/aa.png");
    if ($size != $info['size_download']) {

        echo "下载的数据不完整,请重新下载";

    } else {

        echo "下载数据完整";

    }


?>

 

 3、在cURL中用POST方法发送数据

 

 <?php

    $ch = curl_init();
    $data = array('name'=>'kelly', 'age'=>27, 'sex'=>1);
    curl_setopt($ch, CURLOPT_URL, "http://localhost.post.php");

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //设置为post

    curl_setopt($ch, CURLOPT_POST, 1);

    //把post的变量加上

    curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
    $res = curl_exec($ch);
    curl_close($ch);
    echo $res;


?>

 

用此方法可以模拟留言,或者可以坐灌水机器人,思路都是一样的

4、用cURL上传文件

<?php

    //索要上传的数据

    $data = array('name'=>'beauty', "upload"=>"@a.zip");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1/Socket/upload_file.php");

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $res = curl_exec($ch);
    curl_close($ch);
    echo $res;
?>

注意:要发送文件时,要在文件名前面加上  @  前缀并使用完整路径

 5、cURL设置项

其实,cURL有许多配置选项,这些选项才是cURL的灵魂,通过setopt()设置,下面总结几个比较常见且重要的配置项,希望在对读者在以后用到cURL时有一定的帮助:

CURLOPT_AUTOREFERER:当根据location:重定向时,自动设置header中的Referer:信息

CURLOPT_COOKIESESSION:启用时cURL会紧紧传递一个sessioncookie,忽略其他cookie

CURLOPT_HEADER:将头文件的信息作为数据流输出

CURLOPT_INFILESIZE:设置上传文件的大小,单位为字节

CURLOPT_MAXCONNECTS:允许最大连接数量

CURLOPT_MAXREDIRS:指定HTTP重定向的最多数量

CURLOPT_COOKIE:设置HTTP请求中“cookie:”部分的内容,多个cookie用分号跟个,分号后带一个空格

CURLOPT_POSTFIELDS:全部数据用HTTP协议中的“POST”操作发送要发送文件,在文件名前面加上@前缀并使用完整路径

.......

具体更多配置项请参考PHP手册

 

cURL功能很强大,它是一个通用的库,并非PHP独有。

希望读者通过本博文的几个经典cURL例子的学习能有所收获。

Javascript 相关文章推荐
jquery多选项卡效果实例代码(附效果图)
Mar 23 Javascript
JavaScript模块随意拖动示例代码
May 27 Javascript
js简单工厂模式用法实例
Jun 30 Javascript
JS关闭窗口时产生的事件及用法示例
Aug 20 Javascript
JavaScript重定向URL参数的两种方法小结
Oct 19 Javascript
使用Ajax与服务器(JSON)通信实例
Nov 04 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
JS实现简单表格排序操作示例
Oct 07 Javascript
浅谈webpack组织模块的原理
Mar 10 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
Jun 25 Javascript
vue实现表单录入小案例
Sep 27 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
Javascript闭包用法实例分析
Jan 23 #Javascript
JavaScript学习笔记之Function对象
Jan 22 #Javascript
JavaScript学习笔记之Cookie对象
Jan 22 #Javascript
javascript二维数组转置实例
Jan 22 #Javascript
JavaScript学习笔记之内置对象
Jan 22 #Javascript
JavaScript学习笔记之JS事件对象
Jan 22 #Javascript
jquery实现搜索框常见效果的方法
Jan 22 #Javascript
You might like
用PHP的ob_start();控制您的浏览器cache!
2006/11/25 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
用jscript实现新建word文档
2007/06/15 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
Python with语句和过程抽取思想
2019/12/23 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
Python 忽略文件名编码的方法
2020/08/01 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
商场促销活动策划方案
2014/08/18 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
浅谈Python响应式类库RxPy
2021/06/14 Python
Java的Object类的九种方法
2022/04/13 Java/Android