PHP扩展功能--cURL

摘要

cURL 表示以命令行的形式请求某个 url, 提交数据或获取相应数据。在日常的程序开发中会用到,因此,了解 cURL 的原理和过程,有助于实际工作和项目中的应用。

一、入门三部曲

1、cURL 是什么?

wikipedia 介绍

* cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。
* cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
* libcurl支持的平台有Solaris、NetBSD、FreeBSD、OpenBSD、Darwin、HP-UX、IRIX、AIX、Tru64、Linux、UnixWare、HURD、Windows、Symbian、Amiga、OS/2、BeOS、Mac OS X、Ultrix、QNX、BlackBerry Tablet OS、OpenVMS、RISC OS、Novell NetWare、DOS等。

简而言之:cURL 是下载工具、传输工具。利用 url 的语法规则传输文件、数据的命令行工具和库。

2、为什么要用 cURL?

通常是通过表单(html)提交数据到 php 文件从而实现数据的交互,但是不能实现php 文件之间的数据和文件传输,所以,cURL 的应用场景主要是 php 文件之间的数据和文件传输。

3、在 PHP 中怎么用 cURL?

(1)php.ini 中开启 curl 扩展

extension=php_curl.dll

然后重启 apache

(2)在 phpinfo()的输出信息中查看是否有 curl 的相关信息

【注】:如果开启无效,可以尝试将 php 安装目录下的 libeay32.dll 、ssleay32.dll 拷贝到 windows 或 windows/system32 目录下

二、cURL 在 PHP 中的应用

必备函数:

(1)curl_init() — 初始化 cURL 会话

(2)curl_setopt() — 设置 cURL 传输选项

参数:

  • post 方式:
    • CURLOPT_POST
    • CURLOPT_POSTFIELDS
  • get 方式:
    • CURLOPT_RETURNTRANSFER
    • CURLOPT_SSL_VERIFYHOST
  • 安全验证:
    • CURLOPT_SSL_VERIFYPEER
    • CURLOPT_SSL_VERIFYPEER

(3)curl_exec(); — 执行 cURL 会话

(4)curl_close() — 关闭 cURL 会话

1、模拟 get 请求

(1)默认是直接显示返回的数据,对于 html 数据,则直接以网页的形式显示。

//1、初始化curl
$curl = curl_init();

//2、告诉curl,请求的地址
curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com/index.php');

//3、发送请求
curl_exec($curl);

//4、关闭资源
curl_close($curl);

(2)设置只获取数据,不直接显示

//1、初始化curl
$curl = curl_init();

//2、告诉curl,请求的地址
curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com/index.php');
//将请求的数据返回,而不是直接输出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

//3、发送请求
$res = curl_exec($curl);
var_dump($res);

//4、关闭资源
curl_close($curl);

2、模拟 post 请求

1、初始化curl
$curl = curl_init();

//2、设置请求的地址
curl_setopt($curl, CURLOPT_URL, 'http://localhost/curl_post.php');
// (1)设置请求的方式为post
curl_setopt($curl, CURLOPT_POST, true);
// (2)设置post提交的数据
$data = [
    'username' => 'zqunor',
    'password' => 'zqunor123'
];
// (3)提交数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

//3、发送请求
curl_exec($curl);

//4、关闭资源
curl_close($curl);

3、封装成类,兼容 post 和 get 方式

class HttpRequest
{
    private static $isShow = false;

    public function __set($attr, $value)
    {
        $this->$attr = $value;
    }

    public static function send($url,$data=null)
    {
        $curl = curl_init();
        // 设置请求的url地址
        curl_setopt($curl, CURLOPT_URL, $url);

        // 直接跳过安全证书的验证
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

        // 根据$data判断是post还是get方式
        if (!empty($data)) {
            // 如果$data非空,则为post方式
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        // 反之为get方式
        if (!self::$isShow) {
            // 不直接显示数据,而是以返回值的形式
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, $url);
        }
        $res = curl_exec($curl);
        return $res;

        curl_close($curl);
    }
}

4、实例化进行数据获取

// 调用封装的类,请求知乎php话题下的数据
$res = HttpRequest::send('https://www.zhihu.com/search?type=content&q=php');

// 查看需要获取的数据的html样式
// <a target="_blank" href="/question/26498147/answer/33029411" data-reactid="218"><span class="Highlight" data-reactid="219">「<em>PHP</em> 是最好的语言」这个梗是怎么来的?</span></a>
// <a target="_blank" href="/question/41913568/answer/95778872" data-reactid="366"><span class="Highlight" data-reactid="367">如何看待天猫彻底抛弃<em>PHP</em>?</span></a>
// <a target="_blank" href="/question/25038841/answer/44396770" data-reactid="292"><span class="Highlight" data-reactid="293"><em>PHP</em>、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点?</span></a>

// 根据样式设置正则匹配模式,筛选所需数据
$reg = '/<a[^>]*><span class="Highlight"[^>]*>(.+?)<\/span><\/a>/';

preg_match_all($reg, $res, $match);

var_dump($match);

5、查看匹配结果

完成!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

年底总结一下Python WEB最好用的几个框架,让你有一个系统的了解

2017年就要过完了,我们来总结一下2017年最好用的17个Python Web框架 群内不定时分享干货,包括2017最新的python企业案例学习资料和零基础...

94980
来自专栏上善若水

012 修改 hosts 文件的原理是什么

为了方便用户记忆,我们将IP变成一个个的域名来输入到浏览器进行访问。而这使得访问网站时要先将其域名解析成 IP 。DNS (Domain Name Server...

14440
来自专栏腾讯Bugly的专栏

H5 和移动端 WebView 缓存机制解析与实战

作者:叶建升 个人主页:http://www.linkedin.com/in/jiansheng-ye-b3319778/ 导语 web缓存是web开发逃不开的...

61740
来自专栏Seebug漏洞平台

Gnuboard 漏洞分析

Gnuboard是韩国Sir公司开发一套PHP+Mysql CMS程序。 本身数据结构简单,可扩展性能强,程序运行代码与皮肤文件分离,可扩展数据字段多,可以进行...

39960
来自专栏偏前端工程师的驿站

.Net魔法堂:开启IIS的WebGarden、WebFarm和StateServer之旅

前言                                 公司系统虽然配置有1台NLB后拖4台App Server最后搭一台强劲无比的DB Serv...

31670
来自专栏沈唁志

如何在Ubuntu 16.04上安装PrestaShop

如果您曾经考虑过开设在线商店,您可能会感受到各种免费的开源电子商务解决方案。虽然有这么多的选择意味着几乎可以肯定有一个可用的有效解决方案适合您的特定情况,但它也...

34230
来自专栏IT派

Python入门网络爬虫之精华版

首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫

14720
来自专栏FreeBuf

护卫神主机大师提权漏洞利用分析

护卫神·主机大师支持一键安装网站运行环境(IIS+ASP+ASP.net+PHP5.2-5.6+MySQL+FTP+伪静态+PhpMyAdmin),并可在线开设...

31400
来自专栏公有云大数据平台弹性 MapReduce

Presto内存调优及原理(基础篇)

Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。

2.1K100
来自专栏NetCore

怎样制作GHOST系统盘

制作Windows XP万能克隆镜像 战前分析:对于Windows XP,制作万能克隆时的一个重要问题就是系统激活,因为Windows XP为了防止盗版,采取...

50080

扫码关注云+社区

领取腾讯云代金券