• PHP之cURL


    0、参考资料

    http://php.net/manual/zh/function.curl-setopt.php
    http://www.blogfshare.com/php-curl-get-post.html

    1、什么是CURL

    cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 库。使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库。

    2、基本步骤

    step-1:初始化

    $ch = curl_init()
    

    step-2:设置属性

    curl_setopt()
    

    有一长串cURL参数可供设置,它们能指定URL请求的各个细节。

    step-3:执行并获取结果

    $output = curl_exec($ch);
    

    step-4:释放句柄

    curl_close($ch);
    

    3、核心函数

    cURL函数有很多,详情的可以参考官方文档。
    下面列举出必用或者常用的函数。
    curl_init: 初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。

    $ch = curl_init();
    // or 
    $ch = curl_init($url);
    
    

    curl_setopt:为一个curl设置会话参数。

    curl_exec($ch):执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。

    curl_close($ch):作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

    curl_error($ch):返回当前会话最后一次错误的字符串。

    4、常见重要配置

    **CURLOPT_HTTPHEADER: **设置 HTTP 头字段的数组。格式: array('Content-type: text/plain', 'Content-length: 100')。这里需要注意格式,是一维数组,不是关联数组。

    $headers = array("AuthToken:{$token}","Content-Type:application/x-www-form-urlencoded");
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    

    CURLOPT_RETURNTRANSFER:TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。

    CURLOPT_URL: 需要获取的 URL 地址,也可以在curl_init() 初始化会话的时候。

    CURLOPT_POST: TRUE 时会发送 POST 请求,类型为
    application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。

    **CURLOPT_POSTFIELDS: ** 发送全部数据使用HTTP协议中的POST操作来发送。参数一般需要用http_build_query包装。

    CURLOPT_TIMEOUT: 容许CURL函数执行的最长秒数。

    CURLOPT_NOBODY: TRUE时将不输出BODY内容,这对判断远程文件是否存在,而不需要读取内容场景比较有用。

    两种配置方式:
    ① 按照数组格式进行设置

    $options = array(
    CURLOPT_RETURNTRANSFER =>true,
         CURLOPT_HEADER =>false,
         CURLOPT_POST =>true,
         CURLOPT_POSTFIELDS => $post_data,
         CURLOPT_TIMEOUT => $timeout,
    );
    $ch = curl_init($url);
    curl_setopt_array($ch, $options);
    

    ② 单个属性进行设置

    $options = array(
    CURLOPT_RETURNTRANSFER =>true,
         CURLOPT_HEADER =>false,
         CURLOPT_POST =>true,
         CURLOPT_POSTFIELDS => $post_data,
         CURLOPT_TIMEOUT => $timeout,
    );
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_ HEADER, false);
    curl_setopt($ch, CURLOPT_ POST, true);
    curl_setopt($ch, CURLOPT_ POSTFIELDS, $post);
    curl_setopt($ch, CURLOPT_ TIMEOUT, $ timeout);
    

    5、常见demo示例

    demo-1:

        private function doCurlGet($url)
        {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            $result = curl_exec($ch);
            curl_close($ch);
            return $result;
        }
    

    demo-2:

    function doHttpSend($url, $keysArr, $header = array()) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header );
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        if ($keysArr){//如果不是POST 会报参数错误
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($keysArr));
        }
        curl_setopt($ch, CURLOPT_URL, $url);
    
        $ret = curl_exec($ch);
        if($ret === false){
            var_dump(curl_error($ch));exit;
        }
    
        $error = curl_error($ch);
        curl_close($ch);
        return $error ? $error : $ret;
    }
    

    6、curl与PHP-CLI

    相关链接:https://www.zybuluo.com/a5635268/note/180515

    部分demo示例如下:

    ① 抓取页面内容到一个文件中:

    curl -o jasper.html jasper.pdmp.qq.com
    # 或者
    curl jasper.pdmp.qq.com > tojasper.html
    

    ② 抓具体的文件,用-O(大写的),后面的url要具体到某个文件,不然抓不下来。我们还可以用正则来抓取东西,但文件名还是得具体。

    curl -O http://jasper.pdmp.qq.com/pdmp/friso/images/app/logo.png
    

    ③ 查看响应头信息。

    curl -I jasper.pdmp.qq.com
    

    ④ 带参数请求。

    curl -d user_id=10 http://jasper.pdmp.qq.com/pdmp/user/role
    

    ⑤ 带头部信息请求。

    curl  -H  "Content-Type:application/x-www-form-urlencoded" -d  user_id=10 http://jasper.pdmp.qq.com/pdmp/user/role
    

    ⑥ 当我们经常用curl去搞人家东西的时候,人家会把你的IP给屏蔽掉的,这个时候,我们可以用代理

    curl  -x  24.10.28.84:32779  -o  home.html  http://www.codesky.net
    

    ⑦ 通过ftp下载远程文件

    curl -O http://jasper.pdmp.qq.com/pdmp/friso/styles/common.css
    curl -u 用户名:密码 
    -O http://www.codesky.net/demo/curtain/bbstudy_files/style.css
    
  • 相关阅读:
    Tomcat:基于HTTP协议的Connector配置
    Tomcat:云环境下的Tomcat设计思路——Tomcat的多实例安装
    Tomcat:基于Apache+Tomcat的集群搭建
    Java Security:keytool工具使用说明
    Java Security:Java加密框架(JCA)简要说明
    Java Security:公钥私钥、数字签名、消息摘要是什么
    Java Se:Java Security
    Tomcat源码解读:ClassLoader的设计
    Java Se:自定义ClassLoader
    Java Se: Logging 框架说明
  • 原文地址:https://www.cnblogs.com/jaspersong/p/8298495.html
Copyright © 2020-2023  润新知