PHP 请求用 cURL 还是用 guzzle?

在这里插入图片描述
(图片来源自网络,侵删)

之前编写请求相关的业务逻辑,一直使用 php-curl-class/php-curl-class 这个包,后来由于要引入soap的使用,故而顺带研究了一下 cURL 与 guzzle 的异同,网上查阅资料整理成本篇文章。

当然,适合自己的才是最好,凡事终归是小马过河,下边是正文:

什么是 cURL ?它是使用 URL 传输数据的命令行工具和库,用于在命令行或脚本中传输数据。它也用于汽车,电视机,路由器,打印机,音频设备,移动电话,平板电脑,并且是数千种每天影响着数十亿人的软件应用程序的互联网传输骨干网。

什么是 Guzzle ? 它是一个 PHP HTTP 客户端,可以轻松发送 HTTP 请求,并轻松与 Web 服务集成。 Guzzle 是一个 PHP HTTP 客户端,可以轻松发送 HTTP 请求,并且可以轻松地与 Web 服务集成。

cURL 可以归类为“文件传输”类别中的工具,而 Guzzle 则归类于“微框架(后端)”下。

cURLGuzzle 都是开源工具,在 GitHub上, Guzzle 似乎比 cURL 更受欢迎。

PHP/cURL 的局限性

我们不得不承认,说下边这些是 PHP/cURL 的局限性,这似乎有些误导。我们通过将 PHP/cURL 直接与 Guzzle 的优势进行比较来解释 PHP/cURL 的局限性的说法。如果您正在构建一个简单的脚本,而只需要几行 PHP/cURL 代码就可以进行 HTTP 调用,那么您就不必担心测试和代码质量。使用 PHP/cURL 完全可以。实际上,只要您感到合适就可以继续使用 PHP/cURL。 PHP / cURL没有真正的技术限制。因此,有了这个免责声明,我们继续。

下边列出几个使用 PHP/cURL 时的局限性:

  • 由于 PHP/cURL 使用 libcurl,而 libcurl 使用curl。这是安装命令行工具 curl 的必要条件。如果使用共享主机,则可能没有安装软件包的权限。
  • PHP/cURL 提供了一系列使用 curl 的选项,如其官方文档所示。一方面,它很好,因为它提供了很大的灵活性。另一方面,它太冗长而无法使用。它没有提供最令人愉快的API。
  • 如果使用的是 PHP/cURL ,则单元测试会很麻烦。没有对单元测试的现成支持。

Guzzle 简介

以下是Guzzle官方网站上的官方说明:

Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services.

让我们看看Guzzle如何克服我们先前所说的 PHP/cURL的那些局限性。

  首先, Guzzle 是 HTTP 请求的抽象层。它对PHP/cURL,PHP流,套接字或非阻塞事件循环没有硬性依赖。它封装了底层的 HTTP 传输。如果需要,可以使用PHP/cURL,但这不是必须的。因此,在共享托管环境中,如果PHP/cURL不可行,则可以使用其他替代方法。

  其次,Guzzle 提供了非常干净的 API 来使用。在使用库时,文档非常重要。Guzzle 通过提供全面的文档来做得很好。从技术上讲,Guzzle 用面向对象的编程编写得很好,它使用 PSR-7 作为 HTTP 接口。这意味着它可以与任何其他库兼容,只要它们与 PSR-7 接口兼容即可。

  最后,Guzzle 具有内置的单元测试支持。它提供了一种比较简单的方法来模拟 HTTP 层。查看其文档以获取更多详细信息。

使用 Guzzle

使用Composer安装Guzzle。 在撰写本文时,Guzzle的最新版本是 6.0 。

composer require guzzlehttp/guzzle:~6.0

创建一个入口文件 index.php 并包含 Composer 自动加载文件。 同时,我们将导入Guzzle类:

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

使用 Google 的根 URL 实例化 Guzzle 客户端对象:

$client = new Client([
    'base_uri' => 'http://www.google.com',
]);

向 Google 的搜索 URI 发出 GET 请求。同时,我们传递查询参数 q

$response = $client->request('GET', 'search', [
    'query' => ['q' => 'curl']
]);

最后,我们将输出响应数据:

echo $response->getBody();

完整的代码如下所示:

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'http://www.google.com',
]);

$response = $client->request('GET', 'search', [
    'query' => ['q' => 'curl']
]);

echo $response->getBody();

如您所见,由于 Guzzle 可靠的 OOP 设计,上面的代码几乎是不言自明的。

最后

本文参考了:

  1. From PHP/cURL to Guzzle
  2. cURL vs Guzzle
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 7

laravel7版本已经集成了GuzzleHttp客户端,详细用法请查阅文档HTTP 客户端《Laravel 7 中文文档》

4年前 评论
普罗米修斯 (作者) 4年前
seeker-x2y (楼主) 4年前

guzzle有些配置没暴漏出来接口 其他都好 还支持stream

4年前 评论
seeker-x2y (楼主) 4年前
cevin (作者) 4年前

guzzle 有些配置需要自己看源码研究下,不过一般人也用不到

4年前 评论

curl 真心写不来,我选 Guzzle

4年前 评论

guzzle 很强大,什么请求都能发,不过需要看一些源码,很多人都看不懂源码。

3年前 评论

在对接某些接口的时候,使用guzzle,就没办法调用成功,但是换回curl后,就可以调用成功

3年前 评论

CURL 已经够简单了,我觉得没有特别的原因就用 CURL,当然如果使用的框架自带 Guzzle 的客户端,那使用也无妨。 CURL 都写不来的,我真是替 PHP 感到悲哀。

2年前 评论
seeker-x2y (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!