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 则归类于“微框架(后端)”下。

cURL(curl/curl) 和 Guzzle (guzzle/guzzle) 都是开源工具,在 GitHub上, Guzzle 似乎比 cURL 更受欢迎。

PHP/cURL 的局限性

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

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

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

Guzzle 简介

以下是[Guzzle官方网站](Guzzle Documentation)上的官方说明:

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 Documentation)以获取更多详细信息。

使用 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 设计,上面的代码几乎是不言自明的。

参考资料

PHP 请求该用 cURL 还是 Guzzle ?
php中 可替代curl,laravel-PHP-为什么使用Guzzle代替cURL?

You may also like...

发表评论

您的电子邮箱地址不会被公开。