学习curl扩展功能的使用

硬核项目经理 硬核项目经理     2023-03-02     264

关键词:

学习CURL扩展功能的使用(一)

其实 CURL 这个扩展本来也不打算写得,毕竟这个也是大家最常用的功能之一的。不过既然是在刷文档,学习到了就分享出来吧,不要陷入“知识的诅咒”。本身自己的知识体系就不完整,说不定也有很多小伙伴和我一样只是平常追求业务快速开发而简单地使用,并没有深入地去了解过。今天,我们就来深入地了解一下 CURL 吧。

PHP 的这个 CURL 扩展其实是基于的 libcurl 这个系统的扩展软件。在 linux 相关的系统中,这个软件基本就是标配的,像是 CentOS 、Ubuntu 这些都是装好系统就有的,不需要我们再单独安装这个 libcurl ,就算没有的话,也可以方便地安装到。

而对于 PHP 来说,这个扩展更是已经集成在了 PHP 的源码安装包中,只需要我们在编译安装 PHP 的时候加上 --with-curl 就可以了。

使用 CURL 请求链接

先来看看最简单地使用 CURL 来请求一个 GET 地址。

$ch = curl_init("https://www.baidu.com");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 信任任何证书

$res = curl_exec($ch);
$info = curl_getinfo($ch);
if(curl_error($ch)) 
    var_dump(curl_error($ch));


var_dump($res);
// string(14722) "<!DOCTYPE html><!--STATUS OK-->
// <html>
// <head>
//  <meta http-equiv="content-type" content="text/html;charset=utf-8">
//  <meta http-equiv="X-UA-Compatible" content="IE=Edge">
//  <link rel="dns-prefetch" href="//s1.bdstatic.com"/>
//  <link rel="dns-prefetch" href="//t1.baidu.com"/>
//  <link rel="dns-prefetch" href="//t2.baidu.com"/>
//  <link rel="dns-prefetch" href="//t3.baidu.com"/>
//  <link rel="dns-prefetch" href="//t10.baidu.com"/>
//  <link rel="dns-prefetch" href="//t11.baidu.com"/>
//  <link rel="dns-prefetch" href="//t12.baidu.com"/>
//  <link rel="dns-prefetch" href="//b1.bdstatic.com"/>
//  <title>百度一下,你就知道</title>
//  ……………………
//  ……………………
//  ……………………
// </body></html>
// "

var_dump($info);
// array(37) 
//     ["url"]=>
//     string(21) "https://www.baidu.com"
//     ["content_type"]=>
//     string(9) "text/html"
//     ["http_code"]=>
//     int(200)
//     ["header_size"]=>
//     int(960)
//     ["request_size"]=>
//     int(52)
//     ["filetime"]=>
//     int(-1)
//     ["ssl_verify_result"]=>
//     int(0)
//     ["redirect_count"]=>
//     int(0)
//     ["total_time"]=>
//     float(0.127654)
//     ["namelookup_time"]=>
//     float(0.004669)
//     ["connect_time"]=>
//     float(0.030823)
//     ["pretransfer_time"]=>
//     float(0.100782)
//     ["size_upload"]=>
//     float(0)
//     ["size_download"]=>
//     float(14722)
//     ["speed_download"]=>
//     float(115921)
//     ["speed_upload"]=>
//     float(0)
//     ["download_content_length"]=>
//     float(14722)
//     ["upload_content_length"]=>
//     float(-1)
//     ["starttransfer_time"]=>
//     float(0.127519)
//     ["redirect_time"]=>
//     float(0)
//     ["redirect_url"]=>
//     string(0) ""
//     ["primary_ip"]=>
//     string(15) "183.232.231.172"
//     ["certinfo"]=>
//     array(0) 
//     
//     ["primary_port"]=>
//     int(443)
//     ["local_ip"]=>
//     string(13) "192.168.51.11"
//     ["local_port"]=>
//     int(52795)
//     ["http_version"]=>
//     int(2)
//     ["protocol"]=>
//     int(2)
//     ["ssl_verifyresult"]=>
//     int(0)
//     ["scheme"]=>
//     string(5) "HTTPS"
//     ["appconnect_time_us"]=>
//     int(100710)
//     ["connect_time_us"]=>
//     int(30823)
//     ["namelookup_time_us"]=>
//     int(4669)
//     ["pretransfer_time_us"]=>
//     int(100782)
//     ["redirect_time_us"]=>
//     int(0)
//     ["starttransfer_time_us"]=>
//     int(127519)
//     ["total_time_us"]=>
//     int(127654)
//   

curl_close($ch);

标准的 CURL 套路其实就是三步。curl_init() 打开一个句柄,句柄中包含 URL 地址,curl_exec() 执行句柄输出或返回结果,curl_close() 关闭句柄。为什么说 curl_exec() 是输出或者返回结果呢?因为如果在默认的情况下,curl_exec() 是会像 phpinfo() 这类函数一样直接打印输出结果的,我们需要使用 curl_setopt() 设置 CURLOPT_RETURNTRANSFER 这个常量为 true 或 1 来让 curl_exec() 将访问结果作为返回值进行返回,而不是直接输出。由此可以看出,curl_setopt() 也是 CURL 中非常重要的一个函数。其实它的作用就是为这个 CURL 句柄设置各种配置参数,包括我们在代码中看到的 CURLOPT_SSL_VERIFYHOST 和 CURLOPT_SSL_VERIFYPEER 就是为 HTTPS 链接的访问而准备的配置参数,以及后面我们要看到的 POST 请求也是需要使用 curl_setopt() 来实现的。

curl_exec() 返回的是访问的 URL 返回的结果,curl_getinfo() 返回的则是这个请求一些详细信息,比如我们可以看到请求的 url 地址、Content-Type 类型、http_code 等信息,对于一些业务需求判断来说,这些信息非常重要。curl_error() 则是在本次请求中的错误信息的显示,如果产生了错误,错误信息就可以通过这个函数获取到。

POST 请求

GET 请求是非常简单的,当然,POST 请求也不复杂,就像前面说的,只是配置参数有一些变化而已。

$ch = curl_init("http://localhost:9001");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt_array($ch, [
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => ['a'=>'post测试'],
]);

$res = curl_exec($ch);
$info = curl_getinfo($ch);
if(curl_error($ch)) 
    var_dump(curl_error($ch));


var_dump($res);
// string(22) "测试数据post测试"

curl_close($ch);

在这里,我们用了一个新的函数 curl_setopt_array() ,其实就是可以更加方便地使用数组来定义配置参数而已,和一个一个地写 curl_setopt() 没有什么区别,只是更加地方便。我们只需要指定 CURLOPT_POST 为 true 或 1,然后通过 CURLOPT_POSTFIELDS 为 POST 参数赋值就可以了,是不是也非常简单。

CURL 的字符串 URL 编码

之前我们已经学习过一些编码相关的函数,在 CURL 扩展中,也有对应的 URL 编码函数,其实它和使用 urlencode() 并没有什么太大的区别。

$ch = curl_init("http://localhost:9001");
$str = "测试编码";
$escapeStr = curl_escape($ch, $str);
var_dump($escapeStr); // string(36) "%E6%B5%8B%E8%AF%95%E7%BC%96%E7%A0%81"
var_dump(curl_unescape($ch, $escapeStr)); // string(12) "测试编码"
curl_close($ch);

使用 curl_escape() 就可以对数据进行 URL 编码,使用 curl_unescape() 就可以非常方便地实现解码。不过,这两个函数是必须要一个 CURL 句柄参数的,也就是说,它们不能脱离 CURL 来直接使用。我们日常开发还是使用 urlencode() 这类更为通用的函数就好了。

查看 CURL 的版本号

最后,我们再学习一个非常简单的函数,就是查看一下当前系统的 CURL 版本情况以及一些相关的软件信息,比如支持的协议列表之类的内容。

var_dump(curl_version());
// array(16) 
//     ["version_number"]=>
//     int(475648)
//     ["age"]=>
//     int(5)
//     ["features"]=>
//     int(11519901)
//     ["ssl_version_number"]=>
//     int(0)
//     ["version"]=>
//     string(6) "7.66.0"
//     ["host"]=>
//     string(25) "x86_64-apple-darwin19.5.0"
//     ["ssl_version"]=>
//     string(14) "OpenSSL/1.1.1d"
//     ["libz_version"]=>
//     string(6) "1.2.11"
//     ["protocols"]=>
//     array(23) 
//       [0]=>
//       string(4) "dict"
//       [1]=>
//       string(4) "file"
//       [2]=>
//       string(3) "ftp"
//       [3]=>
//       string(4) "ftps"
//       [4]=>
//       string(6) "gopher"
//       [5]=>
//       string(4) "http"
//       [6]=>
//       string(5) "https"
//       [7]=>
//       string(4) "imap"
//       [8]=>
//       string(5) "imaps"
//       [9]=>
//       string(4) "ldap"
//       [10]=>
//       string(5) "ldaps"
//       [11]=>
//       string(4) "pop3"
//       [12]=>
//       string(5) "pop3s"
//       [13]=>
//       string(4) "rtmp"
//       [14]=>
//       string(4) "rtsp"
//       [15]=>
//       string(3) "scp"
//       [16]=>
//       string(4) "sftp"
//       [17]=>
//       string(3) "smb"
//       [18]=>
//       string(4) "smbs"
//       [19]=>
//       string(4) "smtp"
//       [20]=>
//       string(5) "smtps"
//       [21]=>
//       string(6) "telnet"
//       [22]=>
//       string(4) "tftp"
//     
//     ["ares"]=>
//     string(6) "1.15.0"
//     ["ares_num"]=>
//     int(69376)
//     ["libidn"]=>
//     string(5) "2.2.0"
//     ["iconv_ver_num"]=>
//     int(0)
//     ["libssh_version"]=>
//     string(13) "libssh2/1.9.0"
//     ["brotli_ver_num"]=>
//     int(16777223)
//     ["brotli_version"]=>
//     string(5) "1.0.7"
//   

总结

就像文章开头所说的,CURL 的内容其实并不复杂,核心的就那几步,它最复杂的部分是在于非常多的配置常量信息,而且这些信息并不是太好记,掌握常用的就可以了,后面我们还将继续讲解 CURL 中其它的内容,不要错过哦。

测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/02/source/4.学习CURL扩展功能的使用(一).php

参考文档:

https://www.php.net/manual/zh/ref.curl.php

php的curl功能扩展基本用法(代码片段)

阅读目录阐述curlget和post请求的方法get请求POST请求阐述PHP的curl功能提供了很多函数,需要将这些函数按特定的步骤组合到一起,我们先来了解下PHP建立curl请求的基本步骤。1$ch=curl_init();//创建一个新的CURL资源赋给变量$ch2curl_setop... 查看详情

curl命令使用

...法:curl[option][URL...]在处理URL时其支持类型于SHELL的名称扩展功能,如http://www.jbxue.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html可以生成多个期望的URLcurl的选项功能:不带任何参数时curl将返回指定url中的数据并打印在屏 查看详情

Homebrew 使用 curl 选项扩展 CurlDownloadStrategy

】Homebrew使用curl选项扩展CurlDownloadStrategy【英文标题】:HomebrewextendCurlDownloadStrategywithcurloption【发布时间】:2020-09-0213:55:10【问题描述】:有谁知道如何使用标题扩展自制软件中的CurlDownloadStrategy吗?我已经在这里和github问题中... 查看详情

学习php中统计扩展函数的使用

做统计相关系统的朋友一定都会学习过什么正态分布、方差、标准差之类的概念,在PHP中,也有相应的扩展函数是专门为这些统计相关的功能所开发的。我们今天要学习的stats扩展函数库就是这类操作函数。当然,本... 查看详情

如何评价深度学习框架keras

参考技术A四个字,相当不错。易使用:对于想把它作为黑箱子使用的人,keras超级易上手。扩展性:keras的设计是把大量内部运算都隐藏了。大家很自然而然的就认为它的功能比较狭窄。其实它有的扩展性并不差,有很多办法实... 查看详情

vue学习笔记入门篇——组件的使用

本文为转载,原文:Vue学习笔记入门篇——组件的使用组件定义组件(Component)是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js的编译器为它添加特殊功能。在有些情... 查看详情

学习kotlin-扩展函数(代码片段)

扩展功能什么是扩展功能?顾名思义,扩展函数是帮助我们扩展类的功能而无需接触它们的代码的函数。换句话说,Kotlin中的扩展函数允许我们通过添加新函数来扩展类的功能。该类不必属于我们(可以是第三方... 查看详情

更改 php(xampp) 中的 curl 扩展名?

】更改php(xampp)中的curl扩展名?【英文标题】:changecurlextensioninphp(xampp)?【发布时间】:2016-12-0503:40:08【问题描述】:我最近使用VisualStudio构建了支持http2的curl。我已经在命令提示符下测试了curl.exe。它按预期工作。我的要求是我... 查看详情

swift学习:扩展(extensions)

  扩展就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和Objective-C的分类类似。(与Objective-C不同的是,Swift的扩展没有名字... 查看详情

如何动态启用 SOAP、CURL、OPENSSL 扩展?

】如何动态启用SOAP、CURL、OPENSSL扩展?【英文标题】:howtoenableSOAP,CURL,OPENSSLextensiondynamically?【发布时间】:2011-12-2713:44:16【问题描述】:我尝试使用ini_set()动态启用SOAP、CURL、OPENSSL扩展。使用ini_set()启用上述ext的语法是什么?... 查看详情

如何在 curl 中使用 HTTP/2 的推送功能?

】如何在curl中使用HTTP/2的推送功能?【英文标题】:HowtouseHTTP/2\'spushingfeatureswithcurl?【发布时间】:2015-02-1219:20:54【问题描述】:我一直在寻找使用HTTP/2推送功能的方法,以减少发出的GET请求的数量和特定客户端-服务器实现中... 查看详情

phpextension哪些

phpextension就是php的扩展,这个扩展是有很多的,如:HTTPextensionforPHP旨在为PHP应用提供一个方便而强大的功能扩展。它简化了处理的HTTP网址,日期,重定向,HTTP头信息,消息,客户的首选语言和字符集,以及提供便捷的数据高速... 查看详情

vue组件学习(转载)

什么是组件:组件是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能。在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展... 查看详情

关于window10下php7.3开启curl扩展失败的解决方法

以前根据网上的各种方法去尝试开启curl扩展,毫不例外的全部失败,曾一度想放弃。我使用的wamp环境是自己配置的。最终的的解决方法是php7.3中官方自带的php_curl.dll文件可能存在问题,我从网上下载了一个php_curl.dll文件,替换... 查看详情

thmburpsuite:extender(burpsuite-扩展器)-学习

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/burpsuiteextender本文相关内容:了解如何使用Extender来扩展BurpSuite的功能Extender-扩展器主界面Extender界面如下图所示:Extender的默认视图将为我们提供已加载到BurpSuite中的扩展的... 查看详情

001shiro的架构

...本性的原因就是shiro的扩展是十分容易的.这也决定我们的学习的重点是如何进行shiro的扩展.其实.单纯的学习shiro根本没有意思,在现实的情况下我们总会扩展功能,这就决定我们学习shiro就需要有一个整体的认知.上图就是shiro的核... 查看详情

如何在 Linux/Mac 中更新 PHP curl 扩展?

】如何在Linux/Mac中更新PHPcurl扩展?【英文标题】:HowtoupdatePHPcurlextensioninLinux/Mac?【发布时间】:2016-10-2716:30:34【问题描述】:在PHP中更新curl扩展的最简单方法是什么?我在Mac/Linux上安装了XAMPP,发现它不允许我使用HTTP2,所以我... 查看详情

在 Windows 中为 php 配置 curl 扩展

】在Windows中为php配置curl扩展【英文标题】:configuringcurlextensionforphpinwindows【发布时间】:2011-08-1616:12:48【问题描述】:我正在使用带有php5的Xampp服务器。我一直在尝试让curl扩展工作。但是,做不到。我取消注释php.ini中的php_curl... 查看详情